classification
Title: Bad BaseHTTPRequestHandler response when using HTTP/0.9
Type: behavior Stage:
Components: Library (Lib) Versions: Python 3.6
process
Status: open Resolution:
Dependencies: 10721 Superseder:
Assigned To: Nosy List: barry, gregory.p.smith, martin.panter, xiang.zhang
Priority: normal Keywords: patch

Created on 2016-03-17 07:42 by xiang.zhang, last changed 2016-10-29 11:19 by xiang.zhang.

Files
File name Uploaded Description Edit
force-0.9.patch martin.panter, 2016-10-29 00:51 review
Messages (6)
msg261898 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-03-17 07:42
BaseHTTPRequestHandler in http.server supports HTTP/0.9. But the response for HTTP/0.9 request is implemented wrong. 

Response of HTTP/0.9 request returns message body directly without status line and headers. But if you inherit BaseHTTPRequestHandler and set the default_request_version to "HTTP/1.x", then self.request_version can never be "HTTP/0.9" since in the https://hg.python.org/cpython/file/tip/Lib/http/server.py#l315 branch it does not set version to "HTTP/0.9" and then always sends the status line and headers back.

A trivial patch can fix this problem that set version to "HTTP/0.9" in the branch. But this will cause some failure in tests. The tests in test_httpservers use http.client.HTTPConnection to send and receive HTTP message. But since 3.4, HTTPConnection doesn't support HTTP/0.9-style simple responses. We can use it to test HTTP/0.9 connection if the server is implemented in the right way.

And since http.client.HTTPConnection has dropped the support for HTTP/0.9, is it reasonable to drop the support in http.server too?
msg261899 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-03-17 07:45
can should be can not.

And not only HTTPConnection, support for HTTP/0.9 seems to have been totally abandoned since Python3.4 in http.client.
msg261949 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-03-18 07:21
As I understand it, you are saying if you override the undocumented (but publicly-named) default_request_version attribute, HTTP 0.9 requests no longer work.

I suspect it is even broken by default. My understanding is with HTTP 0.9 you should be able to send b"GET <path>\r\n" and get a response, but Python’s server will deadlock waiting for a second blank line or EOF. It looks like this deadlock has been there since ~forever (1995).

See Issue 10721 which already proposes to remove 0.9 server support. I would be weakly in favour of this (or more strongly if someone can prove my theory that the current support is broken).
msg261952 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-03-18 09:35
I think you are right. Simply run http.server.test() and then telnet to send "GET /", the client hangs. Or add a timeout to BaseHTTPRequestHandler, you can see the timeout error on server output.
msg279642 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-10-29 00:51
Since my last comment, I have become more confident that Python’s request parsing never supported proper HTTP 0.9. So I would prefer to remove it in the next version of Python, and not bother fixing Xiang’s bug in existing versions (unless someone offers a practical reason to fix it).

For the record, this patch is what a fix might look like.
msg279671 - (view) Author: Xiang Zhang (xiang.zhang) * (Python committer) Date: 2016-10-29 11:19
> So I would prefer to remove it in the next version of Python, and not bother fixing Xiang’s bug in existing versions.

+1. In rfc7230, "The expectation to support HTTP/0.9 requests has been removed".
History
Date User Action Args
2016-10-29 11:19:59xiang.zhangsetmessages: + msg279671
2016-10-29 00:51:04martin.pantersetfiles: + force-0.9.patch
keywords: + patch
messages: + msg279642
2016-10-28 23:01:22barrysetnosy: + barry
2016-08-11 10:20:26martin.pantersetdependencies: + Remove HTTP 0.9 server support
2016-03-18 09:35:55xiang.zhangsetmessages: + msg261952
2016-03-18 07:21:46martin.pantersetmessages: + msg261949
2016-03-18 03:01:26xiang.zhangsettype: behavior
2016-03-18 02:58:20xiang.zhangsetnosy: + gregory.p.smith, martin.panter
2016-03-17 07:45:33xiang.zhangsetmessages: + msg261899
2016-03-17 07:42:36xiang.zhangcreate