EndeavourOS/Arch x86_64, requests v2.1.3.
When sending a POST with a body, a Content-Length header is not automatically added, even when posting a string (which is not chunked and has a known length).
import std;
import requests;
void main()
{
auto res = postContent("http://httpbin.org/post", "Hello, World!");
writeln(res);
}
{
"args": {},
"data": "Hello, World!",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Content-Type": "application/octet-stream",
"Host": "httpbin.org",
"Transfer-Encoding": "chunked",
"User-Agent": "dlang-requests",
"X-Amzn-Trace-Id": "Root=1-65b758d9-61bde2ce4c6309560ebd0cc7"
},
"json": null,
"origin": "194.117.188.126",
"url": "http://httpbin.org/post"
}
This is not a problem with httpbin.org, but some services do require the header. An example is batsign.me, with which you can mail small reports to yourself by sending a quick POST to a custom URL.
import std;
import requests;
void main()
{
auto res = postContent("https://batsign.me/at/user@host.com/asdfasdf", "Warning: server is down");
writeln(res);
}
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>411 Length Required</title>
</head><body>
<h1>Length Required</h1>
<p>A request of the requested method POST requires a valid Content-length.<br />
</p>
<hr>
<address>Apache/2.4.38 (Debian) Server at batsign.me Port 443</address>
</body></html>
It can be worked around by using Request.post instead of postContent and manually adding the header.
import std;
import requests;
void main()
{
enum body_ = "Warning: server is down";
auto rq = Request();
rq.addHeaders([ "Content-Length": body_.length.to!string ]);
auto res = rq.post("https://batsign.me/at/user@host.com/asdfasdf", body_);
writeln(cast(string)res.responseBody);
}
Looking through the examples in the readme, it seems like the length is properly calculated and added if you use multi-part forms? (I didn't test and verify)
But it doesn't for simple strings at least. Is this intended behaviour?
EndeavourOS/Arch x86_64, requests v2.1.3.
When sending a POST with a body, a
Content-Lengthheader is not automatically added, even when posting a string (which is not chunked and has a known length).{ "args": {}, "data": "Hello, World!", "files": {}, "form": {}, "headers": { "Accept-Encoding": "gzip,deflate", "Content-Type": "application/octet-stream", "Host": "httpbin.org", "Transfer-Encoding": "chunked", "User-Agent": "dlang-requests", "X-Amzn-Trace-Id": "Root=1-65b758d9-61bde2ce4c6309560ebd0cc7" }, "json": null, "origin": "194.117.188.126", "url": "http://httpbin.org/post" }This is not a problem with
httpbin.org, but some services do require the header. An example is batsign.me, with which you can mail small reports to yourself by sending a quick POST to a custom URL.It can be worked around by using
Request.postinstead ofpostContentand manually adding the header.Looking through the examples in the readme, it seems like the length is properly calculated and added if you use multi-part forms? (I didn't test and verify)
But it doesn't for simple strings at least. Is this intended behaviour?