diff --git a/scrapy/core/downloader/webclient.py b/scrapy/core/downloader/webclient.py index 2c6a61b8a..add5576ef 100644 --- a/scrapy/core/downloader/webclient.py +++ b/scrapy/core/downloader/webclient.py @@ -118,6 +118,9 @@ class ScrapyHTTPClientFactory(HTTPClientFactory): self.headers['Content-Length'] = len(self.body) # just in case a broken http/1.1 decides to keep connection alive self.headers.setdefault("Connection", "close") + # Content-Length must be specified in POST method even with no body + elif self.method == 'POST': + self.headers['Content-Length'] = 0 def _build_response(self, body, request): request.meta['download_latency'] = self.headers_time-self.start_time diff --git a/tests/test_webclient.py b/tests/test_webclient.py index a16eb1ccf..e0b46286a 100644 --- a/tests/test_webclient.py +++ b/tests/test_webclient.py @@ -132,6 +132,18 @@ class ScrapyHTTPPageGetterTests(unittest.TestCase): "\r\n" "name=value") + # test a POST method with no body provided + factory = client.ScrapyHTTPClientFactory(Request( + method='POST', + url='http://foo/bar' + )) + + self._test(factory, + "POST /bar HTTP/1.0\r\n" + "Host: foo\r\n" + "Content-Length: 0\r\n" + "\r\n") + # test with single and multivalued headers factory = client.ScrapyHTTPClientFactory(Request( url='http://foo/bar',