from http.server import BaseHTTPRequestHandler
from io import BytesIO
class HTTPRequest(BaseHTTPRequestHandler):
def __init__(self, request_text):
self.rfile = BytesIO(request_text)
self.raw_requestline = self.rfile.readline()
self.error_code = self.error_message = None
self.parse_request()
def send_error(self, code, message):
self.error_code = code
self.error_message = message
request_text = (
b'GET /who/ken/trust.html HTTP/1.1\r\n'
b'Host: cm.bell-labs.com\r\n'
b'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n'
b'Accept: text/html;q=0.9,text/plain\r\n'
b'\r\n'
)
request = HTTPRequest(request_text)
print( "Error code:", request.error_code ) # None (check this first)
print( "request.command", request.command ) # "GET"
print( "request.path", request.path ) # "/who/ken/trust.html"
print( "request.request_version", request.request_version ) # "HTTP/1.1"
print( "len(request.headers)", len(request.headers) ) # 3
print( "request.headers.keys()",request.headers.keys() ) # ['accept-charset', 'host', 'accept']
print( "request.headers['host']", request.headers['host'] ) # "cm.bell-labs.com"
print( "type(request.headers)", type(request.headers) )
ZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcgpmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgpjbGFzcyBIVFRQUmVxdWVzdChCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0X3RleHQpOgogICAgICAgIHNlbGYucmZpbGUgPSBCeXRlc0lPKHJlcXVlc3RfdGV4dCkKICAgICAgICBzZWxmLnJhd19yZXF1ZXN0bGluZSA9IHNlbGYucmZpbGUucmVhZGxpbmUoKQogICAgICAgIHNlbGYuZXJyb3JfY29kZSA9IHNlbGYuZXJyb3JfbWVzc2FnZSA9IE5vbmUKICAgICAgICBzZWxmLnBhcnNlX3JlcXVlc3QoKQoKICAgIGRlZiBzZW5kX2Vycm9yKHNlbGYsIGNvZGUsIG1lc3NhZ2UpOgogICAgICAgIHNlbGYuZXJyb3JfY29kZSA9IGNvZGUKICAgICAgICBzZWxmLmVycm9yX21lc3NhZ2UgPSBtZXNzYWdlCgoKcmVxdWVzdF90ZXh0ID0gKAogICAgYidHRVQgL3doby9rZW4vdHJ1c3QuaHRtbCBIVFRQLzEuMVxyXG4nCiAgICBiJ0hvc3Q6IGNtLmJlbGwtbGFicy5jb21cclxuJwogICAgYidBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuNywqO3E9MC4zXHJcbicKICAgIGInQWNjZXB0OiB0ZXh0L2h0bWw7cT0wLjksdGV4dC9wbGFpblxyXG4nCiAgICBiJ1xyXG4nCiAgICApCgpyZXF1ZXN0ID0gSFRUUFJlcXVlc3QocmVxdWVzdF90ZXh0KQoKcHJpbnQoICJFcnJvciBjb2RlOiIsIHJlcXVlc3QuZXJyb3JfY29kZSApICAgICAgIyBOb25lICAoY2hlY2sgdGhpcyBmaXJzdCkKcHJpbnQoICJyZXF1ZXN0LmNvbW1hbmQiLCByZXF1ZXN0LmNvbW1hbmQgKSAgICAgICAgICMgIkdFVCIKcHJpbnQoICJyZXF1ZXN0LnBhdGgiLCByZXF1ZXN0LnBhdGggKSAgICAgICAgICAgICMgIi93aG8va2VuL3RydXN0Lmh0bWwiCnByaW50KCAicmVxdWVzdC5yZXF1ZXN0X3ZlcnNpb24iLCByZXF1ZXN0LnJlcXVlc3RfdmVyc2lvbiApICMgIkhUVFAvMS4xIgpwcmludCggImxlbihyZXF1ZXN0LmhlYWRlcnMpIiwgbGVuKHJlcXVlc3QuaGVhZGVycykgKSAgICAjIDMKcHJpbnQoICJyZXF1ZXN0LmhlYWRlcnMua2V5cygpIixyZXF1ZXN0LmhlYWRlcnMua2V5cygpICkgICMgWydhY2NlcHQtY2hhcnNldCcsICdob3N0JywgJ2FjY2VwdCddCnByaW50KCAicmVxdWVzdC5oZWFkZXJzWydob3N0J10iLCByZXF1ZXN0LmhlYWRlcnNbJ2hvc3QnXSApICMgImNtLmJlbGwtbGFicy5jb20iCnByaW50KCAidHlwZShyZXF1ZXN0LmhlYWRlcnMpIiwgdHlwZShyZXF1ZXN0LmhlYWRlcnMpICkg