# HG changeset patch # User paulb # Date 1124919948 0 # Node ID 07157f0de6764e9482294607485a7f56ac0499a0 # Parent cf6356dbde7607e7260a83668fbfdaa0434e2254 [project @ 2005-08-24 21:45:48 by paulb] Fixed path and parameter decoding to handle "URL encoded" values in the main path as well as in the path parameters. diff -r cf6356dbde76 -r 07157f0de676 WebStack/BaseHTTPRequestHandler.py --- a/WebStack/BaseHTTPRequestHandler.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/BaseHTTPRequestHandler.py Wed Aug 24 21:45:48 2005 +0000 @@ -21,7 +21,7 @@ """ import Generic -from Helpers.Request import MessageBodyStream, get_body_fields, get_storage_items, Cookie +from Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo from Helpers.Session import SessionStore @@ -274,10 +274,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), keep_blank_values=1).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields diff -r cf6356dbde76 -r 07157f0de676 WebStack/CGI.py --- a/WebStack/CGI.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/CGI.py Wed Aug 24 21:45:48 2005 +0000 @@ -22,7 +22,7 @@ import Generic import os, sys -from Helpers.Request import MessageBodyStream, get_body_fields, get_storage_items, Cookie +from Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo from Helpers.Session import SessionStore @@ -208,7 +208,7 @@ character values. """ - path = self.decode_path(self.env.get("SCRIPT_NAME") or "", encoding) + path = decode_value(self.env.get("SCRIPT_NAME") or "", encoding) path += self.get_path_info(encoding) return path @@ -225,7 +225,7 @@ character values. """ - return self.decode_path(self.env.get("PATH_INFO") or "", encoding) + return decode_value(self.env.get("PATH_INFO") or "", encoding) def get_query_string(self): @@ -252,10 +252,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), keep_blank_values=1).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields diff -r cf6356dbde76 -r 07157f0de676 WebStack/Generic.py --- a/WebStack/Generic.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/Generic.py Wed Aug 24 21:45:48 2005 +0000 @@ -271,10 +271,10 @@ unquoted_path = urllib.unquote(path) if encoding is not None: try: - return unquoted_path.decode(encoding) + return unicode(unquoted_path, encoding) except UnicodeError: pass - return unquoted_path.decode(self.default_charset) + return unicode(unquoted_path, self.default_charset) def encode_path(self, path, encoding=None): diff -r cf6356dbde76 -r 07157f0de676 WebStack/JavaServlet.py --- a/WebStack/JavaServlet.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/JavaServlet.py Wed Aug 24 21:45:48 2005 +0000 @@ -224,12 +224,10 @@ character values. """ - # NOTE: To be verified. - path = self.get_path_without_query(encoding) qs = self.get_query_string() if qs: - return path = "?" + qs + return path + "?" + qs else: return path @@ -245,6 +243,9 @@ character values. """ + # NOTE: We do not actually use the encoding - this may be a servlet + # NOTE: container option. + return self.request.getContextPath() + self.request.getServletPath() + self.get_path_info(encoding) def get_path_info(self, encoding=None): @@ -260,6 +261,9 @@ character values. """ + # NOTE: We do not actually use the encoding - this may be a servlet + # NOTE: container option. + return self.request.getPathInfo() or "" def get_query_string(self): diff -r cf6356dbde76 -r 07157f0de676 WebStack/ModPython.py --- a/WebStack/ModPython.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/ModPython.py Wed Aug 24 21:45:48 2005 +0000 @@ -21,7 +21,7 @@ """ import Generic -from Helpers.Request import get_body_field, filter_fields, Cookie +from Helpers.Request import get_body_field, decode_value, filter_fields, Cookie from Helpers.Response import ConvertingStream from mod_python.util import parse_qs, FieldStorage from mod_python import apache @@ -186,9 +186,9 @@ query_string = self.get_query_string() if query_string: - return self.decode_path(self.trans.uri, encoding) + "?" + query_string + return decode_value(self.trans.uri, encoding) + "?" + query_string else: - return self.decode_path(self.trans.uri, encoding) + return decode_value(self.trans.uri, encoding) def get_path_without_query(self, encoding=None): @@ -202,7 +202,7 @@ character values. """ - return self.decode_path(self.trans.uri, encoding) + return decode_value(self.trans.uri, encoding) def get_path_info(self, encoding=None): @@ -217,7 +217,7 @@ character values. """ - return self.decode_path(self.trans.path_info, encoding) + return decode_value(self.trans.path_info, encoding) def get_query_string(self): @@ -244,10 +244,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), 1).items(): # keep_blank_values=1 - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields @@ -282,7 +282,7 @@ fields = {} for field in self.storage_body.list: - field_name = self.decode_path(field.name, encoding) + field_name = decode_value(field.name, encoding) if not fields.has_key(field_name): fields[field_name] = [] fields[field_name].append(get_body_field(field.value, encoding)) diff -r cf6356dbde76 -r 07157f0de676 WebStack/Twisted.py --- a/WebStack/Twisted.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/Twisted.py Wed Aug 24 21:45:48 2005 +0000 @@ -22,7 +22,7 @@ import Generic from Helpers.Auth import UserInfo -from Helpers.Request import Cookie, get_body_field, filter_fields +from Helpers.Request import Cookie, decode_value, filter_fields from Helpers.Response import ConvertingStream from Helpers.Session import SessionStore from cgi import parse_qs @@ -187,7 +187,7 @@ character values. """ - return self.decode_path("/%s" % "/".join(self.trans.postpath), encoding) + return decode_value("/%s" % "/".join(self.trans.postpath), encoding) def get_query_string(self): @@ -221,10 +221,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), keep_blank_values=1).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields @@ -254,11 +254,7 @@ encoding = encoding or self.get_content_type().charset or self.default_charset fields = {} for field_name, field_values in self.trans.args.items(): - - # NOTE: Need to use the special path decoding method due to the - # NOTE: mixing of path and body fields within Twisted. - - field_name = self.decode_path(field_name, encoding) + field_name = decode_value(field_name, encoding) # Find the body values. @@ -268,9 +264,9 @@ # Twisted stores plain strings. for field_str in field_values: - fields[field_name].append(get_body_field(field_str, encoding)) + fields[field_name].append(decode_value(field_str, encoding)) else: - fields[field_name] = get_body_field(field_values, encoding) + fields[field_name] = decode_value(field_values, encoding) return fields diff -r cf6356dbde76 -r 07157f0de676 WebStack/WSGI.py --- a/WebStack/WSGI.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/WSGI.py Wed Aug 24 21:45:48 2005 +0000 @@ -22,7 +22,7 @@ import Generic import os, sys -from Helpers.Request import MessageBodyStream, get_body_fields, get_storage_items, Cookie +from Helpers.Request import MessageBodyStream, get_body_fields, decode_value, get_storage_items, Cookie from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo from Helpers.Session import SessionStore @@ -212,7 +212,7 @@ character values. """ - path = self.decode_path(self.env.get("SCRIPT_NAME") or "", encoding) + path = decode_value(self.env.get("SCRIPT_NAME") or "", encoding) path += self.get_path_info(encoding) return path @@ -229,7 +229,7 @@ character values. """ - return self.decode_path(self.env.get("PATH_INFO") or "", encoding) + return decode_value(self.env.get("PATH_INFO") or "", encoding) def get_query_string(self): @@ -256,10 +256,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), keep_blank_values=1).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields diff -r cf6356dbde76 -r 07157f0de676 WebStack/Webware.py --- a/WebStack/Webware.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/Webware.py Wed Aug 24 21:45:48 2005 +0000 @@ -24,7 +24,7 @@ from cgi import parse_qs import StringIO from Helpers import Environment -from Helpers.Request import Cookie, get_body_field, filter_fields +from Helpers.Request import Cookie, get_body_field, decode_value, filter_fields from Helpers.Response import ConvertingStream class Transaction(Generic.Transaction): @@ -203,7 +203,7 @@ real_path_info = path_info[len(context_name):] else: real_path_info = path_info - return self.decode_path(real_path_info, encoding) + return decode_value(real_path_info, encoding) def get_query_string(self): @@ -230,10 +230,10 @@ fields = {} for name, values in parse_qs(self.get_query_string(), keep_blank_values=1).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields @@ -258,13 +258,17 @@ def _get_fields(self, encoding=None): encoding = encoding or self.get_content_type().charset or self.default_charset fields = {} + for field_name, field_values in self.trans.request().fields().items(): + field_name = decode_value(field_name, encoding) + if type(field_values) == type([]): fields[field_name] = [] for field_str in field_values: fields[field_name].append(get_body_field(field_str, encoding)) else: fields[field_name] = [get_body_field(field_values, encoding)] + return fields def get_fields(self, encoding=None): diff -r cf6356dbde76 -r 07157f0de676 WebStack/Zope.py --- a/WebStack/Zope.py Wed Aug 24 21:35:54 2005 +0000 +++ b/WebStack/Zope.py Wed Aug 24 21:45:48 2005 +0000 @@ -27,7 +27,7 @@ import Generic from Helpers import Environment -from Helpers.Request import Cookie, get_body_field, filter_fields +from Helpers.Request import Cookie, get_body_field, decode_value, filter_fields from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo import cgi @@ -182,7 +182,7 @@ # NOTE: Based on WebStack.CGI.get_path. - path = self.decode_path(self.request.environ.get("SCRIPT_NAME") or "", encoding) + path = decode_value(self.request.environ.get("SCRIPT_NAME") or "", encoding) path += self.get_path_info(encoding) return path @@ -202,7 +202,7 @@ product_path = "/".join(self.adapter.getPhysicalPath()) path_info = self.request.environ.get("PATH_INFO") or "" real_path_info = path_info[len(product_path):] - return self.decode_path(real_path_info, encoding) + return decode_value(real_path_info, encoding) def get_query_string(self): @@ -229,10 +229,10 @@ fields = {} for name, values in cgi.parse_qs(self.get_query_string()).items(): - name = self.decode_path(name, encoding) + name = decode_value(name, encoding) fields[name] = [] for value in values: - value = self.decode_path(value, encoding) + value = decode_value(value, encoding) fields[name].append(value) return fields @@ -260,7 +260,9 @@ encoding = encoding or self.get_content_type().charset or self.default_charset self._fields = {} + for field_name, field_values in self.request.form.items(): + field_name = decode_value(field_name, encoding) # Find the body values.