# HG changeset patch # User paulb # Date 1093711913 0 # Node ID aba9091606258d511a76bbf1cc1d3fefe1ff9ab2 # Parent a1e815930f7a4797219ef5ee265e0cfc73d85647 [project @ 2004-08-28 16:51:53 by paulb] Changed the field values for uploaded files - plain strings are now used instead of file-like objects. Introduced usage of helper functionality to reduce duplicated code dealing with FieldStorage objects - see WebStack.Helpers.Request. diff -r a1e815930f7a -r aba909160625 WebStack/BaseHTTPRequestHandler.py --- a/WebStack/BaseHTTPRequestHandler.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/BaseHTTPRequestHandler.py Sat Aug 28 16:51:53 2004 +0000 @@ -5,7 +5,7 @@ """ import Generic -from Helpers.Request import MessageBodyStream +from Helpers.Request import MessageBodyStream, get_body_fields, get_storage_items from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo from cgi import parse_qs, FieldStorage @@ -209,8 +209,7 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). """ encoding = self.get_content_type().charset or encoding or "iso-8859-1" @@ -227,13 +226,8 @@ # Traverse the storage, finding each field value. - for field_name in self.storage_body.keys(): - fields[field_name] = [] - for field_value in self.storage_body.getlist(field_name): - if hasattr(field_value, "file"): - fields[field_name].append(field_value.file) - else: - fields[field_name].append(unicode(field_value, encoding)) + fields = get_body_fields(get_storage_items(self.storage_body), encoding) + return fields def get_user(self): diff -r a1e815930f7a -r aba909160625 WebStack/CGI.py --- a/WebStack/CGI.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/CGI.py Sat Aug 28 16:51:53 2004 +0000 @@ -6,7 +6,7 @@ import Generic import os, sys -from Helpers.Request import MessageBodyStream +from Helpers.Request import MessageBodyStream, get_body_fields, get_storage_items from Helpers.Response import ConvertingStream from Helpers.Auth import UserInfo from Helpers import Environment @@ -203,8 +203,7 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). """ encoding = self.get_content_type().charset or encoding or "iso-8859-1" @@ -220,13 +219,8 @@ # Traverse the storage, finding each field value. - for field_name in self.storage_body.keys(): - fields[field_name] = [] - for field_value in self.storage_body.getlist(field_name): - if hasattr(field_value, "file"): - fields[field_name].append(field_value.file) - else: - fields[field_name].append(unicode(field_value, encoding)) + fields = get_body_fields(get_storage_items(self.storage_body), encoding) + return fields def get_user(self): diff -r a1e815930f7a -r aba909160625 WebStack/Generic.py --- a/WebStack/Generic.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/Generic.py Sat Aug 28 16:51:53 2004 +0000 @@ -256,8 +256,7 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). """ raise NotImplementedError, "get_fields_from_body" diff -r a1e815930f7a -r aba909160625 WebStack/JavaServlet.py --- a/WebStack/JavaServlet.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/JavaServlet.py Sat Aug 28 16:51:53 2004 +0000 @@ -6,7 +6,7 @@ import Generic from StringIO import StringIO -from Helpers.Request import Cookie +from Helpers.Request import Cookie, get_body_fields, get_storage_items import javax.servlet.http.Cookie from cgi import FieldStorage @@ -238,16 +238,13 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). NOTE: There may not be a reliable means of extracting only the fields NOTE: from the message body. Moreover, the encoding of the fields may NOTE: not be pertinent. """ - fields = {} - # Where the content type is "multipart/form-data", we use the # FieldStorage class from the standard library. Otherwise, we use the # Servlet API's parameter access methods. @@ -267,27 +264,9 @@ # Traverse the storage, finding each field value. - for field_name in self.storage_body.keys(): - - # NOTE: Jython 2.1 does not have a cgi module with a - # NOTE: FieldStorage.getlist implementation. - - field_values = self.storage_body.getvalue(field_name) - - if type(field_values) == type([]): - fields[field_name] = [] - for field_value in field_values: - if hasattr(field_value, "file"): - fields[field_name].append(field_value.file) - else: - fields[field_name].append(field_value) - else: - if hasattr(field_values, "file"): - fields[field_name] = [field_values.file] - else: - fields[field_name] = [field_values] - + fields = get_body_fields(get_storage_items(self.storage_body), None) else: + fields = {} parameter_map = self.request.getParameterMap() if parameter_map: for key in parameter_map.keySet(): diff -r a1e815930f7a -r aba909160625 WebStack/ModPython.py --- a/WebStack/ModPython.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/ModPython.py Sat Aug 28 16:51:53 2004 +0000 @@ -5,6 +5,7 @@ """ import Generic +from Helpers.Request import get_body_field from Helpers.Response import ConvertingStream from mod_python.util import parse_qs, FieldStorage from mod_python import apache @@ -163,8 +164,7 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). The mod_python.util.FieldStorage class may augment the fields from the body with fields found in the path. @@ -181,10 +181,7 @@ for field in self.storage_body.list: if not fields.has_key(field.name): fields[field.name] = [] - if hasattr(field.value, "file"): - fields[field.name].append(field.value.file) - else: - fields[field.name].append(unicode(field.value, encoding)) + fields[field.name].append(get_body_field(field.value, encoding)) return fields def get_user(self): diff -r a1e815930f7a -r aba909160625 WebStack/Twisted.py --- a/WebStack/Twisted.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/Twisted.py Sat Aug 28 16:51:53 2004 +0000 @@ -6,7 +6,7 @@ import Generic from Helpers.Auth import UserInfo -from Helpers.Request import Cookie +from Helpers.Request import Cookie, get_body_field from Helpers.Response import ConvertingStream from cgi import parse_qs @@ -158,19 +158,21 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). """ encoding = self.get_content_type().charset or encoding or "iso-8859-1" fields = {} for field_name, field_values in self.trans.args.items(): - fields[field_name] = [] - for field_value in field_values: - if hasattr(field_value, "file"): - fields[field_name].append(field_value.file) - else: - fields[field_name].append(unicode(field_value, encoding)) + if type(field_values) == type([]): + fields[field_name] = [] + + # Twisted stores plain strings. + + 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_user(self): diff -r a1e815930f7a -r aba909160625 WebStack/Webware.py --- a/WebStack/Webware.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/Webware.py Sat Aug 28 16:51:53 2004 +0000 @@ -8,7 +8,7 @@ from cgi import parse_qs import StringIO from Helpers import Environment -from Helpers.Request import Cookie +from Helpers.Request import Cookie, get_body_field from Helpers.Response import ConvertingStream class Transaction(Generic.Transaction): @@ -174,28 +174,18 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). """ encoding = self.get_content_type().charset or encoding or "iso-8859-1" - - # Fix the non-list results. - fields = {} for field_name, field_values in self.trans.request().fields().items(): if type(field_values) == type([]): fields[field_name] = [] - for field_value in field_values: - if hasattr(field_value, "file"): - fields[field_name].append(field_value.file) - else: - fields[field_name].append(unicode(field_value, encoding)) + for field_str in field_values: + fields[field_name].append(get_body_field(field_str, encoding)) else: - if hasattr(field_values, "file"): - fields[field_name] = [field_values.file] - else: - fields[field_name] = [unicode(field_values, encoding)] + fields[field_name] = [get_body_field(field_values, encoding)] return fields def get_user(self): diff -r a1e815930f7a -r aba909160625 WebStack/Zope.py --- a/WebStack/Zope.py Fri Aug 27 23:53:03 2004 +0000 +++ b/WebStack/Zope.py Sat Aug 28 16:51:53 2004 +0000 @@ -8,7 +8,7 @@ import Generic from Helpers import Environment -from Helpers.Request import Cookie +from Helpers.Request import Cookie, get_body_fields from Helpers.Response import ConvertingStream from ZPublisher.HTTPRequest import FileUpload @@ -177,8 +177,7 @@ Returns a dictionary mapping field names to lists of values (even if a single value is associated with any given field name). Each value is either a Unicode object (representing a simple form field, for example) - or a file-like object (representing a file upload form field, for - example). + or a plain string (representing a file upload form field, for example). NOTE: Zope doesn't distinguish between path and body fields. """ @@ -186,14 +185,7 @@ # NOTE: Conversion to Unicode may be inappropriate. encoding = self.get_content_type().charset or encoding or "iso-8859-1" - fields = {} - for field_name, field_values in self.get_fields_from_path().items(): - fields[field_name] = [] - for field_value in field_values: - if isinstance(field_value, FileUpload): - fields[field_name].append(field_value) - else: - fields[field_name].append(unicode(field_value, encoding)) + fields = get_body_fields(self.get_fields_from_path().items(), encoding) return fields def get_user(self):