homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: attribute headers of http.server.BaseHTTPRequestHandler sometimes does not exists
Type: behavior Stage: resolved
Components: Documentation Versions: Python 3.4, Python 3.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: docs@python Nosy List: docs@python, georg.brandl, joru, math_foo, python-dev
Priority: normal Keywords: patch

Created on 2013年06月16日 09:59 by joru, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
documentation18229.patch math_foo, 2014年04月15日 17:58 documentation concerning headers attribute in HTTPBaseRequestHandler review
Messages (7)
msg191264 - (view) Author: Jordan Szubert (joru) Date: 2013年06月16日 09:59
it seems that problem is someone connecting to port 8080 with non-http client, could not find warning in documentation
---fragment of `less access.log`------------
81.172.30.254 - - [16/Jun/2013 11:36:58] "^SBitTorrent protocol^@^@^@^@^@^X^@^Ej
81.172.30.254 - - [16/Jun/2013 11:38:11] "^N<U+008E>^@f ̧ãÄòQ;3x<U+0092>b^C^HÄA7
81.172.30.254 - - [16/Jun/2013 11:39:22] "^SBitTorrent protocol^@^@^@^@^@^X^@^Ej
81.172.30.254 - - [16/Jun/2013 11:40:35] "Ã<U+008D>¬0æz<U+0093>zr^D<U+009B>2]WQ
Exception happened during processing of request from ('81.172.30.254', 63650)
Traceback (most recent call last):
 File "c:\Python33\lib\socketserver.py", line 306, in _handle_request_noblock
 self.process_request(request, client_address)
 File "c:\Python33\lib\socketserver.py", line 332, in process_request
 self.finish_request(request, client_address)
 File "c:\Python33\lib\socketserver.py", line 345, in finish_request
 self.RequestHandlerClass(request, client_address, self)
 File "c:\Python33\lib\socketserver.py", line 666, in __init__
 self.handle()
 File "c:\Python33\lib\http\server.py", line 400, in handle
 self.handle_one_request()
 File "c:\Python33\lib\http\server.py", line 380, in handle_one_request
 if not self.parse_request():
 File "c:\Python33\lib\http\server.py", line 283, in parse_request
 self.send_error(400, "Bad request version (%r)" % version)
 File "c:\Python33\lib\http\server.py", line 428, in send_error
 self.send_response(code, message)
 File "c:\Python33\lib\http\server.py", line 443, in send_response
 self.log_request(code)
 File "c:\Users\joru\Dropbox\programowanie\demoniszcze\server\_lowerHTTP.py", line 30, in log_request
 xff=req.headers.get('X-Forwarded-For')
AttributeError: '_HNDL_3' object has no attribute 'headers'
# _HNLD_3 derives from http.server.BaseHTTPRequestHandler
msg199065 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2013年10月06日 10:53
This appears to be a bug in the _lowerHTTP module, which does not ship with Python.
msg199077 - (view) Author: Jordan Szubert (joru) Date: 2013年10月06日 14:50
what _lowerHTTP does is try read request header 'X-Forwarded-For', but instance of request handler have attribute headers only if thing that connected to port where server listens happened to send valid enough http request
my problem is, documentation does not help write code that would not crash when client sends random bytes instead of expected http request
msg199083 - (view) Author: Jordan Szubert (joru) Date: 2013年10月06日 15:39
#minimal server:
#!/c/Python33/python.exe
from http.server import HTTPServer as S, BaseHTTPRequestHandler as H
class HNDL(H):
	def log_request(req,code):
		print('header is',req.headers.get('X-Forwarder-For'),', code',code)
		H.log_request(req)
s=S(('',54321),HNDL)
s.serve_forever()
#non-http client:
#!/c/Python33/python.exe
import socket,os
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 54321))
s.sendall(os.urandom(1024))
buf=s.recv(2048)
s.close()
print(buf)
#running server:
$ ./server.py
127.0.0.1 - - [06/Oct/2013 17:33:41] code 400, message Bad HTTP/0.9 request type
 ('E)\xaeE^2¤\xf2W\x8f\xb3aG')
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 18234)
Traceback (most recent call last):
 File "c:\Python33\lib\socketserver.py", line 306, in _handle_request_noblock
 self.process_request(request, client_address)
 File "c:\Python33\lib\socketserver.py", line 332, in process_request
 self.finish_request(request, client_address)
 File "c:\Python33\lib\socketserver.py", line 345, in finish_request
 self.RequestHandlerClass(request, client_address, self)
 File "c:\Python33\lib\socketserver.py", line 666, in __init__
 self.handle()
 File "c:\Python33\lib\http\server.py", line 400, in handle
 self.handle_one_request()
 File "c:\Python33\lib\http\server.py", line 380, in handle_one_request
 if not self.parse_request():
 File "c:\Python33\lib\http\server.py", line 311, in parse_request
 "Bad HTTP/0.9 request type (%r)" % command)
 File "c:\Python33\lib\http\server.py", line 428, in send_error
 self.send_response(code, message)
 File "c:\Python33\lib\http\server.py", line 443, in send_response
 self.log_request(code)
 File "./server.py", line 5, in log_request
 print('header is',req.headers.get('X-Forwarder-For'),', code',code)
AttributeError: 'HNDL' object has no attribute 'headers'
----------------------------------------
#running client:
$ ./client.py
b''
$
msg199084 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2013年10月06日 15:43
OK, so I guess it could be documented that the "headers" attribute is not set if the request cannot be parsed as a HTTP request. That's a valid point.
By the way, you should really call your "self" argument "self".
msg216349 - (view) Author: Caelyn McAulay (math_foo) Date: 2014年04月15日 17:58
Added comment to documentation concerning when the headers attribute gets set. 
I confirmed that the headers attribute is only ever set in the parse_request method of BaseHTTPRequestHandler and only if the request is successfully parsed as HTTP.
msg216523 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2014年04月16日 17:56
New changeset 104fab0143e9 by Senthil Kumaran in branch '3.4':
Address issue 18229 - Explain http.server.BaseHTTPRequestHandler's .headers attribute further.
http://hg.python.org/cpython/rev/104fab0143e9 
History
Date User Action Args
2022年04月11日 14:57:46adminsetgithub: 62429
2014年04月16日 17:58:01orsenthilsetstatus: open -> closed
stage: resolved
resolution: fixed
versions: + Python 3.5, - Python 2.7, Python 3.3
2014年04月16日 17:56:55python-devsetnosy: + python-dev
messages: + msg216523
2014年04月15日 17:58:44math_foosetfiles: + documentation18229.patch

nosy: + math_foo
messages: + msg216349

keywords: + patch
2013年10月06日 15:43:34georg.brandlsetmessages: + msg199084
versions: + Python 2.7, Python 3.4
2013年10月06日 15:39:49jorusetmessages: + msg199083
2013年10月06日 14:50:40jorusetstatus: closed -> open
resolution: not a bug -> (no value)
messages: + msg199077
2013年10月06日 10:53:42georg.brandlsetstatus: open -> closed

nosy: + georg.brandl
messages: + msg199065

resolution: not a bug
2013年06月16日 09:59:21jorucreate

AltStyle によって変換されたページ (->オリジナル) /