# HG changeset patch # User paulb # Date 1193524762 0 # Node ID 535a005228e1e8ef6d50bbebbbde7c5c79e077ea # Parent 5b11cdfca380a3f6ce17a14e2d9af4e7966805d8 [project @ 2007-10-27 22:39:13 by paulb] Adopted the HeaderDict for all header collections. diff -r 5b11cdfca380 -r 535a005228e1 WebStack/BaseHTTPRequestHandler.py --- a/WebStack/BaseHTTPRequestHandler.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/BaseHTTPRequestHandler.py Sat Oct 27 22:39:22 2007 +0000 @@ -21,7 +21,7 @@ """ import WebStack.Generic -from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie +from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie, HeaderDict from WebStack.Helpers.Response import ConvertingStream from WebStack.Helpers.Auth import UserInfo from WebStack.Helpers.Session import SessionStore @@ -49,7 +49,7 @@ self.content_type = None self.response_code = 200 self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() # Define the incoming cookies. @@ -112,7 +112,7 @@ """ self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() # Server-related methods. diff -r 5b11cdfca380 -r 535a005228e1 WebStack/CGI.py --- a/WebStack/CGI.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/CGI.py Sat Oct 27 22:39:22 2007 +0000 @@ -22,7 +22,8 @@ import WebStack.Generic import os, sys -from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie +from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, \ + decode_value, get_storage_items, Cookie, HeaderDict from WebStack.Helpers.Response import ConvertingStream from WebStack.Helpers.Auth import UserInfo from WebStack.Helpers.Session import SessionStore @@ -54,7 +55,7 @@ self.content_type = None self.response_code = 200 self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() # Define the incoming cookies. @@ -109,7 +110,7 @@ """ self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() # Server-related methods. diff -r 5b11cdfca380 -r 535a005228e1 WebStack/Helpers/Environment.py --- a/WebStack/Helpers/Environment.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/Helpers/Environment.py Sat Oct 27 22:39:22 2007 +0000 @@ -20,6 +20,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ +import WebStack.Helpers.Request + cgi_names = ("CONTENT_LENGTH", "CONTENT_TYPE") def get_headers(env): @@ -31,13 +33,14 @@ Returns a dictionary-like object containing likely headers. """ - headers = {} + headers = WebStack.Helpers.Request.HeaderDict() + for cgi_key, value in env.items(): if cgi_key.startswith("HTTP_"): - header_name = cgi_key[len("HTTP_"):].replace("_", "-").lower() + header_name = cgi_key[len("HTTP_"):].replace("_", "-") headers[header_name] = value elif cgi_key in cgi_names: - header_name = cgi_key.replace("_", "-").lower() + header_name = cgi_key.replace("_", "-") headers[header_name] = value return headers diff -r 5b11cdfca380 -r 535a005228e1 WebStack/Helpers/Request.py --- a/WebStack/Helpers/Request.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/Helpers/Request.py Sat Oct 27 22:39:22 2007 +0000 @@ -87,6 +87,52 @@ self.stream.close() +class HeaderDict: + + "A dictionary for headers." + + def __init__(self, headers=None): + self.headers = {} + if headers is not None: + self.update(headers) + + # Lower-case-string-coercing methods. + + def __getitem__(self, key): + return self.headers[str(key).lower()] + + def __setitem__(self, key, value): + self.headers[str(key).lower()] = value + + def get(self, key, default=None): + return self.headers.get(str(key).lower(), default) + + def has_key(self, key): + return self.headers.has_key(str(key).lower()) + + # Forwarding methods. + + def keys(self): + return self.headers.keys() + + def values(self): + return self.headers.values() + + def items(self): + return self.headers.items() + + # Derived from the above. + + def __contains__(self, key): + return self.has_key(key) + + def update(self, other): + for k, v in other.items(): + self[k] = v + + def __repr__(self): + return "HeaderDict(%r)" % self.headers + class HeaderValue: "A container for header information." @@ -108,6 +154,9 @@ else: raise AttributeError, name + def __repr__(self): + return "HeaderValue(%r)" % str(self) + def __str__(self): """ @@ -191,7 +240,7 @@ """ self.stream = stream - self.headers = headers or {} + self.headers = headers or HeaderDict() self.cache = None def __getattr__(self, name): @@ -269,7 +318,7 @@ returing a dictionary mapping names to HeaderValue objects. """ - new_headers = {} + new_headers = HeaderDict() for name, value in headers.items(): new_headers[name] = parse_header_value(HeaderValue, value) return new_headers diff -r 5b11cdfca380 -r 535a005228e1 WebStack/JavaServlet.py --- a/WebStack/JavaServlet.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/JavaServlet.py Sat Oct 27 22:39:22 2007 +0000 @@ -24,7 +24,7 @@ from StringIO import StringIO from WebStack.Helpers.Request import Cookie, FileContent, get_body_fields, \ get_storage_items, get_fields_from_query_string, filter_fields, \ - HeaderValue + HeaderDict, HeaderValue import javax.servlet.http import jarray @@ -183,7 +183,7 @@ NOTE: need to change. """ - headers = {} + headers = HeaderDict() header_names_enum = self.request.getHeaderNames() while header_names_enum.hasMoreElements(): @@ -520,8 +520,10 @@ time.time function, and indicates the expiry date/time of the cookie. """ - cookie = javax.servlet.http.Cookie(self.encode_cookie_value(name), - self.encode_cookie_value(value)) + cookie = javax.servlet.http.Cookie( + self.encode_cookie_value(name), + self.encode_cookie_value(value) + ) if path is not None: cookie.setPath(path) @@ -620,7 +622,6 @@ boundary = fp.readline() str_buffer.write('Content-Type: multipart/mixed; boundary="%s"\n\n' % boundary[2:-2]) str_buffer.write(boundary) - str_buffer.write(fp.read()) str_buffer.close() # Concatenate the headers with the rest of the stream. @@ -664,7 +665,7 @@ # Using properly decoded header values. - headers = {} + headers = HeaderDict() for header in part.getAllHeaders(): headers[header.getName()] = self.parse_header_value(HeaderValue, header.getValue()) diff -r 5b11cdfca380 -r 535a005228e1 WebStack/WSGI.py --- a/WebStack/WSGI.py Sat Oct 27 22:38:58 2007 +0000 +++ b/WebStack/WSGI.py Sat Oct 27 22:39:22 2007 +0000 @@ -22,7 +22,8 @@ import WebStack.Generic import os, sys -from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie +from WebStack.Helpers.Request import MessageBodyStream, get_body_fields, \ + decode_value, get_storage_items, Cookie, HeaderDict from WebStack.Helpers.Response import ConvertingStream from WebStack.Helpers.Auth import UserInfo from WebStack.Helpers.Session import SessionStore @@ -50,7 +51,7 @@ self.content_type = None self.response_code = 200 self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() # Define the incoming cookies. @@ -86,7 +87,7 @@ """ self.content = StringIO() - self.headers_out = {} + self.headers_out = HeaderDict() self.cookies_out = SimpleCookie() def get_wsgi_headers(self):