OK got it. Curl sends an "Expect: 100-continue" header when the request
body has a certain minimum size. vibe.d has to respond with a 100 code
followed by two line breaks in that case. It responded, but with just
one line break. This caused curl to wait for one second because it
thought it may not continue sending the request. And then on top of
that, when it finally send the request body, the reponse body was also
interpreted in a weird way as partially a part of the response header.

Anyway, this is fixed now ;)