Skip to content

No automatic Content-Length on POST #165

@zorael

Description

@zorael

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions