I'm trying to submit a multipart form containing an image with vibe.d
My code looks like this:
auto f = File("image.jpg");
auto data = new char[f.size];
f.rawRead(data);
string boundary = randomUUID.toString.toUpper();
string h = "--Boundary-" ~ boundary ~ "\r\n";
h ~= `Content-Disposition: form-data; name="type"` ~ "\r\n\r\n";
h ~= "photo\r\n";
h ~= "--Boundary-" ~ boundary ~ "\r\n";
h ~= `Content-Disposition: form-data; name="photo"; filename="558704D0-2855-4689-996C-F556BE4A3872.jpg"` ~ "\r\n";
h ~= "Content-Type: image/jpeg\r\n\r\n";
h ~= data ~ "\r\n";
h ~= "--Boundary-" ~ boundary ~ "\r\n";
h ~= `Content-Disposition: form-data; name="photo_ids"` ~ "\r\n\r\n";
h ~= `["55227F15-36D2-4A04-A4D9-FB23C00627D1"]` ~ "\r\n";
h ~= "--Boundary-" ~ boundary ~ "\r\n";
auto response = requestHTTP("https://httpbin.org/anything", (scope req) {
req.method = HTTPMethod.POST;
req.headers["content-type"] = "multipart/form-data; boundary=Boundary-" ~ boundary;
req.headers["content-length"] = to!string(h.length);
req.bodyWriter.write(h);
}).bodyReader.readAllUTF8();
logInfo(response);
but httpbin tells me that I posted nothing:
[main(----) INF] {
[main(----) INF] "args": {},
[main(----) INF] "data": "",
[main(----) INF] "files": {},
[main(----) INF] "form": {},
[main(----) INF] "headers": {
[main(----) INF] "Accept-Encoding": "gzip, deflate",
[main(----) INF] "Content-Length": "58038",
[main(----) INF] "Content-Type": "multipart/form-data; boundary=Boundary-76CCC942-83EB-4339-BB6B-2C7D5BF027B6",
[main(----) INF] "Host": "httpbin.org",
[main(----) INF] "User-Agent": "vibe.d/1.7.0 (HTTPClient, +http://vibed.org/)"
[main(----) INF] },
[main(----) INF] "json": null,
[main(----) INF] "method": "POST",
[main(----) INF] "origin": "",
[main(----) INF] "url": "https://httpbin.org/anything"
[main(----) INF] }
I have no idea what I'm doing wrong. Would appreciate any help
Your multipart data is malformed. For the last boundary you have to append a "--" string to indicate the end. So instead of the last
h ~= "--Boundary-" ~ boundary ~ "\r\n";
it needs to be
h ~= "--Boundary-" ~ boundary ~ "--\r\n";`
and then it will work.
See https://www.freesoft.org/CIE/RFC/1521/16.htm
Eventually this should be supported as API inside vibe.d, and there are 2 open PRs for this, but for now you have to work around it like you did.