New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
attribute headers of http.server.BaseHTTPRequestHandler sometimes does not exists #62429
Comments
it seems that problem is someone connecting to port 8080 with non-http client, could not find warning in documentation ---fragment of 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 |
This appears to be a bug in the _lowerHTTP module, which does not ship with Python. |
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 |
#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: 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: |
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". |
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. |
New changeset 104fab0143e9 by Senthil Kumaran in branch '3.4': |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: