more optimisations. no need to uppercase or lowercase each time we want

to test an header since the parser already send the headers in uppercase
This commit is contained in:
benoitc 2010-08-11 11:12:10 +02:00
parent e8bc2cdae8
commit 42d97c3815
2 changed files with 21 additions and 18 deletions

View File

@ -62,18 +62,20 @@ class Message(object):
def set_body_reader(self): def set_body_reader(self):
chunked = False chunked = False
clength = None clength = None
for (name, value) in self.headers: for (name, value) in self.headers:
if name.upper() == "CONTENT-LENGTH": if name == "CONTENT-LENGTH":
try: try:
clength = int(value) clength = int(value)
except ValueError: except ValueError:
clength = None clength = None
elif name.upper() == "TRANSFER-ENCODING": elif name == "TRANSFER-ENCODING":
chunked = value.lower() == "chunked" chunked = value.lower() == "chunked"
elif name.upper() == "SEC-WEBSOCKET-KEY1": elif name == "SEC-WEBSOCKET-KEY1":
clength = 8 clength = 8
if clength is not None or chunked:
break
if chunked: if chunked:
self.body = Body(ChunkedReader(self, self.unreader)) self.body = Body(ChunkedReader(self, self.unreader))
elif clength is not None: elif clength is not None:
@ -83,11 +85,13 @@ class Message(object):
def should_close(self): def should_close(self):
for (h, v) in self.headers: for (h, v) in self.headers:
if h.lower() == "connection": if h == "CONNECTION":
if v.lower().strip() == "close": v = v.lower().strip()
if v == "close":
return True return True
elif v.lower().strip() == "keep-alive": elif v == "keep-alive":
return False return False
break
return self.version <= (1, 0) return self.version <= (1, 0)

View File

@ -32,24 +32,23 @@ def create(req, sock, client, server, cfg):
content_type = "" content_type = ""
content_length = "" content_length = ""
for hdr_name, hdr_value in req.headers: for hdr_name, hdr_value in req.headers:
name = hdr_name.lower() if hdr_name == "EXPECT":
if name == "expect":
# handle expect # handle expect
if hdr_value.lower() == "100-continue": if hdr_value.lower() == "100-continue":
sock.send("HTTP/1.1 100 Continue\r\n\r\n") sock.send("HTTP/1.1 100 Continue\r\n\r\n")
elif name == "x-forwarded-for": elif hdr_name == "X-FORWARDED-FOR":
forward = hdr_value forward = hdr_value
elif name == "x-forwarded-protocol" and hdr_value.lower() == "ssl": elif hdr_name == "X-FORWARDED-PROTOCOL" and hdr_value.lower() == "ssl":
url_scheme = "https" url_scheme = "https"
elif name == "x-forwarded-ssl" and hdr_value.lower() == "on": elif hdr_name == "X-FORWARDED-SSL" and hdr_value.lower() == "on":
url_scheme = "https" url_scheme = "https"
elif name == "host": elif hdr_name == "HOST":
server = hdr_value server = hdr_value
elif name == "script_name": elif hdr_name == "SCRIPT_NAME":
script_name = hdr_value script_name = hdr_value
elif name == "content-type": elif hdr_name == "CONTENT-TYPE":
content_type = hdr_value content_type = hdr_value
elif name == "content-length": elif hdr_name == "CONTENT-LENGTH":
content_length = hdr_value content_length = hdr_value
else: else:
continue continue
@ -107,7 +106,7 @@ def create(req, sock, client, server, cfg):
} }
for key, value in req.headers: for key, value in req.headers:
key = 'HTTP_' + key.upper().replace('-', '_') key = 'HTTP_' + key.replace('-', '_')
if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'):
environ[key] = value environ[key] = value