diff --git a/gunicorn/http/message.py b/gunicorn/http/message.py index a31511ad..e31844df 100644 --- a/gunicorn/http/message.py +++ b/gunicorn/http/message.py @@ -62,18 +62,20 @@ class Message(object): def set_body_reader(self): chunked = False clength = None - for (name, value) in self.headers: - if name.upper() == "CONTENT-LENGTH": + if name == "CONTENT-LENGTH": try: clength = int(value) except ValueError: clength = None - elif name.upper() == "TRANSFER-ENCODING": + elif name == "TRANSFER-ENCODING": chunked = value.lower() == "chunked" - elif name.upper() == "SEC-WEBSOCKET-KEY1": + elif name == "SEC-WEBSOCKET-KEY1": clength = 8 - + + if clength is not None or chunked: + break + if chunked: self.body = Body(ChunkedReader(self, self.unreader)) elif clength is not None: @@ -83,11 +85,13 @@ class Message(object): def should_close(self): for (h, v) in self.headers: - if h.lower() == "connection": - if v.lower().strip() == "close": + if h == "CONNECTION": + v = v.lower().strip() + if v == "close": return True - elif v.lower().strip() == "keep-alive": + elif v == "keep-alive": return False + break return self.version <= (1, 0) diff --git a/gunicorn/http/wsgi.py b/gunicorn/http/wsgi.py index 7f55c377..d34335e9 100644 --- a/gunicorn/http/wsgi.py +++ b/gunicorn/http/wsgi.py @@ -32,24 +32,23 @@ def create(req, sock, client, server, cfg): content_type = "" content_length = "" for hdr_name, hdr_value in req.headers: - name = hdr_name.lower() - if name == "expect": + if hdr_name == "EXPECT": # handle expect if hdr_value.lower() == "100-continue": 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 - elif name == "x-forwarded-protocol" and hdr_value.lower() == "ssl": + elif hdr_name == "X-FORWARDED-PROTOCOL" and hdr_value.lower() == "ssl": 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" - elif name == "host": + elif hdr_name == "HOST": server = hdr_value - elif name == "script_name": + elif hdr_name == "SCRIPT_NAME": script_name = hdr_value - elif name == "content-type": + elif hdr_name == "CONTENT-TYPE": content_type = hdr_value - elif name == "content-length": + elif hdr_name == "CONTENT-LENGTH": content_length = hdr_value else: continue @@ -107,7 +106,7 @@ def create(req, sock, client, server, cfg): } 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'): environ[key] = value