[Zope-Checkins] CVS: Zope/lib/python/ZPublisher - BaseRequest.py:1.49 BaseResponse.py:1.16 BeforeTraverse.py:1.10 Client.py:1.45 Converters.py:1.18 HTTPRangeSupport.py:1.7 HTTPRequest.py:1.79 HTTPResponse.py:1.68 Publish.py:1.157 Request.py:1.10 Response.py:1.51 TaintedString.py:1.2 Test.py:1.40 __init__.py:1.12 cgi_hotfix.py:1.3 mapply.py:1.6 maybe_lock.py:1.4 xmlrpc.py:1.12

Martijn Pieters mj@zope.com
Wed, 14 Aug 2002 18:09:41 -0400


Update of /cvs-repository/Zope/lib/python/ZPublisher
In directory cvs.zope.org:/tmp/cvs-serv20811

Modified Files:
	BaseRequest.py BaseResponse.py BeforeTraverse.py Client.py 
	Converters.py HTTPRangeSupport.py HTTPRequest.py 
	HTTPResponse.py Publish.py Request.py Response.py 
	TaintedString.py Test.py __init__.py cgi_hotfix.py mapply.py 
	maybe_lock.py xmlrpc.py 
Log Message:
Clean up indentation and trailing whitespace.


=== Zope/lib/python/ZPublisher/BaseRequest.py 1.48 => 1.49 ===
--- Zope/lib/python/ZPublisher/BaseRequest.py:1.48	Tue Jul 16 09:01:48 2002
+++ Zope/lib/python/ZPublisher/BaseRequest.py	Wed Aug 14 18:09:39 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __version__='$Revision$'[11:-2]
 
@@ -25,7 +25,7 @@
 
         def manage_property_types(self):
             return type_converters.keys()
-            
+
 except:
     class RequestContainer:
         __roles__=None
@@ -35,7 +35,7 @@
 _marker=[]
 class BaseRequest:
     """Provide basic ZPublisher request management
-    
+
     This object provides access to request data. Request data may
     vary depending on the protocol used.
 
@@ -60,7 +60,7 @@
 
     # Allow (reluctantly) access to unprotected attributes
     __allow_access_to_unprotected_subobjects__=1
-        
+
     def __init__(self, other=None, **kw):
         """The constructor is not allowed to raise errors
         """
@@ -95,8 +95,8 @@
         Return a value for the required variable name.
         The value will be looked up from one of the request data
         categories. The search order is environment variables,
-        other variables, form data, and then cookies. 
-        
+        other variables, form data, and then cookies.
+
         """
         if key=='REQUEST': return self
 
@@ -117,7 +117,7 @@
             v=self._file
             self.other[key]=v
             return v
-        
+
         return default
 
     def __getitem__(self, key, default=_marker):
@@ -185,17 +185,17 @@
             # Make sure that certain things that dont make sense
             # cannot be traversed.
             if item in ('REQUEST', 'aq_self', 'aq_base'):
-                return response.notFoundError(path) 
+                return response.notFoundError(path)
             if not item or item=='.':
                 continue
             elif item == '..':
                 del clean[-1]
             else: clean.append(item)
         path=clean
-    
+
         # How did this request come in? (HTTP GET, PUT, POST, etc.)
         method=req_method=request_get('REQUEST_METHOD', 'GET').upper()
-        
+
         if method=='GET' or method=='POST':
             # Probably a browser
             no_acquire_flag=0
@@ -208,26 +208,26 @@
         else:
             no_acquire_flag=0
 
-        URL=request['URL']        
+        URL=request['URL']
         parents=request['PARENTS']
         object=parents[-1]
         del parents[:]
 
         roles = getattr(object, '__roles__', UNSPECIFIED_ROLES)
-        
+
         # if the top object has a __bobo_traverse__ method, then use it
         # to possibly traverse to an alternate top-level object.
         if hasattr(object,'__bobo_traverse__'):
             try:
                 object=object.__bobo_traverse__(request)
                 roles =getattr(object, '__roles__', UNSPECIFIED_ROLES)
-            except: pass            
+            except: pass
 
         if not path and not method:
             return response.forbiddenError(self['URL'])
 
         # Traverse the URL to find the object:
-        if hasattr(object, '__of__'): 
+        if hasattr(object, '__of__'):
             # Try to bind the top-level object to the request
             # This is how you get 'self.REQUEST'
             object=object.__of__(RequestContainer(REQUEST=request))
@@ -292,7 +292,7 @@
                         return response.debugError(
                           "Object name begins with an underscore at: %s" % URL)
                     else: return response.forbiddenError(entry_name)
-    
+
                 if hasattr(object,'__bobo_traverse__'):
                     subobject=object.__bobo_traverse__(request,entry_name)
                     if type(subobject) is type(()) and len(subobject) > 1:
@@ -311,7 +311,7 @@
                         # an object 'test' existed above it in the
                         # heirarchy -- you'd always get the
                         # existing object :(
-                        
+
                         if (no_acquire_flag and len(path) == 0 and
                             hasattr(object, 'aq_base')):
                             if hasattr(object.aq_base, entry_name):
@@ -325,7 +325,7 @@
                                 TypeError, AttributeError):
                             if debug_mode:
                                 return response.debugError(
-                                    "Cannot locate object at: %s" % URL) 
+                                    "Cannot locate object at: %s" % URL)
                             else:
                                 return response.notFoundError(URL)
 
@@ -409,7 +409,7 @@
                 while user is None and i < last_parent_index:
                     parent=parents[i]
                     i=i+1
-                    if hasattr(parent, '__allow_groups__'): 
+                    if hasattr(parent, '__allow_groups__'):
                         groups=parent.__allow_groups__
                     else: continue
                     if hasattr(groups,'validate'): v=groups.validate
@@ -429,7 +429,7 @@
 
         # Remove http request method from the URL.
         request['URL']=URL
-    
+
         return object
 
     retry_count=0
@@ -488,4 +488,3 @@
             """<strong>You are not authorized to access this resource""")
 
     return None
-


=== Zope/lib/python/ZPublisher/BaseResponse.py 1.15 => 1.16 ===
--- Zope/lib/python/ZPublisher/BaseResponse.py:1.15	Wed Aug 14 12:45:53 2002
+++ Zope/lib/python/ZPublisher/BaseResponse.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 '''CGI Response Output formatter
 
@@ -28,10 +28,10 @@
     debug_mode = None
     _auth = None
     _error_format = 'text/plain'
-    
+
     # Allow (reluctantly) access to unprotected attributes
     __allow_access_to_unprotected_subobjects__ = 1
-        
+
     def __init__(self, stdout, stderr,
                  body='', headers=None, status=None, cookies=None):
         self.stdout = stdout
@@ -44,7 +44,7 @@
         if cookies is None:
             cookies = {}
         self.cookies = cookies
-    
+
     def setStatus(self, status, reason=None):
         self.status = status
 
@@ -90,13 +90,13 @@
         self.setBody(self.getBody() + body)
 
     def getHeader(self, name):
-         '''\
-         Get a header value
-         
-         Returns the value associated with a HTTP return header, or
-         "None" if no such header has been set in the response
-         yet. '''
-         return self.headers.get(name, None)
+        '''\
+        Get a header value
+
+        Returns the value associated with a HTTP return header, or
+        "None" if no such header has been set in the response
+        yet. '''
+        return self.headers.get(name, None)
 
     def __getitem__(self, name):
         'Get the value of an output header'
@@ -127,7 +127,7 @@
         cookies on the response object.
 
         Note that published objects must not generate any errors
-        after beginning stream-oriented output. 
+        after beginning stream-oriented output.
 
         """
         self.body = self.body+data


=== Zope/lib/python/ZPublisher/BeforeTraverse.py 1.9 => 1.10 ===
--- Zope/lib/python/ZPublisher/BeforeTraverse.py:1.9	Wed Aug 14 10:28:32 2002
+++ Zope/lib/python/ZPublisher/BeforeTraverse.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __version__='$Revision$'[11:-2]
 
@@ -73,7 +73,7 @@
         bpth = bpth._prior
     bpth = MultiHook(hookname, bpth, dic)
     setattr(container, hookname, bpth)
-    
+
     keys = btr.keys()
     keys.sort()
     for key in keys:


=== Zope/lib/python/ZPublisher/Client.py 1.44 => 1.45 ===
--- Zope/lib/python/ZPublisher/Client.py:1.44	Wed Jan  2 10:56:04 2002
+++ Zope/lib/python/ZPublisher/Client.py	Wed Aug 14 18:09:40 2002
@@ -6,19 +6,19 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 """Bobo call interface
 
-This module provides tools for accessing web objects as if they were 
-functions or objects with methods.  It also provides a simple call function 
+This module provides tools for accessing web objects as if they were
+functions or objects with methods.  It also provides a simple call function
 that allows one to simply make a single web request.
 
   Function -- Function-like objects that return both header and body
@@ -62,7 +62,7 @@
         self.func_name=url[url.rfind('/')+1:]
         self.__dict__['__name__']=self.func_name
         self.func_defaults=()
-        
+
         self.args=arguments
 
         if method is not None: self.method=method
@@ -107,7 +107,7 @@
             if not method or method=='POST':
                 for v in kw.values():
                     if hasattr(v,'read'): return self._mp_call(kw)
-                
+
         can_marshal=type2marshal.has_key
         for k,v in kw.items():
             t=type(v)
@@ -134,9 +134,9 @@
             headers['Authorization']=(
                 "Basic %s" %
                 encodestring('%s:%s' % (self.username,self.password)).replace(
-				     '\012','')
+                                     '\012','')
                 )
-	    
+
         try:
             h=HTTP()
             h.connect(self.host, self.port)
@@ -168,9 +168,9 @@
             elif ec == 503:              t=NotAvailable
             else:                        t=ServerError
         raise t, RemoteException(t,v,f,l,self.url,query,ec,em,response)
-        
 
-    
+
+
 
     def _mp_call(self,kw,
                 type2suffix={
@@ -200,7 +200,7 @@
             c=encodestring('%s:%s' % (self.username,self.password)).replace('\012','')
             rq.append('Authorization: Basic %s' % c)
         rq.append(MultiPart(d).render())
-        rq='\r\n'.join(rq)   
+        rq='\r\n'.join(rq)
 
         try:
             sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
@@ -222,11 +222,11 @@
             headers=mimetools.Message(reply,0)
             response=reply.read()
         finally:
-          if 0:
-            raise NotAvailable, (
-                RemoteException(NotAvailable,sys.exc_info()[1],
-                                self.url,'<MultiPart Form>'))
-                
+            if 0:
+                raise NotAvailable, (
+                    RemoteException(NotAvailable,sys.exc_info()[1],
+                                    self.url,'<MultiPart Form>'))
+
         if ec==200: return (headers,response)
         self.handleError('', ec, em, headers, response)
 
@@ -270,7 +270,7 @@
         return f
 
 def call(url,username=None, password=None, **kw):
-    
+
     return apply(Function(url,username=username, password=password), (), kw)
 
 ##############################################################################
@@ -295,12 +295,12 @@
         if t is lt or t is tt:
             raise TypeError, 'Invalid recursion in data to be marshaled.'
         r.append(marshal_whatever("%s:%s" % (n,tname) ,v))
-    
+
     return '&'.join(r)
 
 def marshal_tuple(n,l):
     return marshal_list(n,l,'tuple')
-    
+
 type2marshal={
     type(1.0):                  marshal_float,
     type(1):                    marshal_int,
@@ -549,7 +549,7 @@
     except:
         print usage
         sys.exit(1)
-        
+
     # The "main" program for this module
     f=Function(url)
     if user: f.username, f.password = user, pw


=== Zope/lib/python/ZPublisher/Converters.py 1.17 => 1.18 ===
--- Zope/lib/python/ZPublisher/Converters.py:1.17	Thu Aug  1 12:00:41 2002
+++ Zope/lib/python/ZPublisher/Converters.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __version__='$Revision$'[11:-2]
 
@@ -20,7 +20,7 @@
     if hasattr(v,'read'): return v.read()
     elif isinstance(v,UnicodeType) :
         return v.encode('latin1')
-    else:  
+    else:
         return str(v)
 
 def field2text(v, nl=re.compile('\r\n|\n\r').search):
@@ -38,7 +38,7 @@
         else:          l=mo.start(0)
 
     r.append(v[s:])
-        
+
     return '\n'.join(r)
 
 def field2required(v):
@@ -66,7 +66,7 @@
         try: return float(v)
         except ValueError:
             raise ValueError, (
-                "A floating-point number was expected in the value '%s'" % 
+                "A floating-point number was expected in the value '%s'" %
                 escape(v)
                 )
     raise ValueError, (


=== Zope/lib/python/ZPublisher/HTTPRangeSupport.py 1.6 => 1.7 ===
--- Zope/lib/python/ZPublisher/HTTPRangeSupport.py:1.6	Wed Jan  2 10:56:04 2002
+++ Zope/lib/python/ZPublisher/HTTPRangeSupport.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 """HTTP Range support utilities.
 
@@ -122,7 +122,7 @@
     optimized = []
     add = optimized.append
     start, end = ranges.pop()
-    
+
     while ranges:
         nextstart, nextend = ranges.pop()
         # If the next range overlaps
@@ -130,7 +130,7 @@
             # If it falls within the current range, discard
             if nextend <= end:
                 continue
-            
+
             # Overlap, adjust end
             end = nextend
         else:
@@ -139,7 +139,7 @@
 
     # Add the remaining optimized range
     add((start, end))
-    
+
     return optimized
 
 class HTTPRangeInterface(Interface.Base):


=== Zope/lib/python/ZPublisher/HTTPRequest.py 1.78 => 1.79 ===
--- Zope/lib/python/ZPublisher/HTTPRequest.py:1.78	Wed Aug 14 12:45:53 2002
+++ Zope/lib/python/ZPublisher/HTTPRequest.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 
 __version__='$Revision$'[11:-2]
@@ -29,22 +29,22 @@
     import cgi_hotfix
 
 isCGI_NAME = {
-        'SERVER_SOFTWARE' : 1, 
-        'SERVER_NAME' : 1, 
-        'GATEWAY_INTERFACE' : 1, 
-        'SERVER_PROTOCOL' : 1, 
-        'SERVER_PORT' : 1, 
-        'REQUEST_METHOD' : 1, 
-        'PATH_INFO' : 1, 
-        'PATH_TRANSLATED' : 1, 
-        'SCRIPT_NAME' : 1, 
-        'QUERY_STRING' : 1, 
-        'REMOTE_HOST' : 1, 
-        'REMOTE_ADDR' : 1, 
-        'AUTH_TYPE' : 1, 
-        'REMOTE_USER' : 1, 
-        'REMOTE_IDENT' : 1, 
-        'CONTENT_TYPE' : 1, 
+        'SERVER_SOFTWARE' : 1,
+        'SERVER_NAME' : 1,
+        'GATEWAY_INTERFACE' : 1,
+        'SERVER_PROTOCOL' : 1,
+        'SERVER_PORT' : 1,
+        'REQUEST_METHOD' : 1,
+        'PATH_INFO' : 1,
+        'PATH_TRANSLATED' : 1,
+        'SCRIPT_NAME' : 1,
+        'QUERY_STRING' : 1,
+        'REMOTE_HOST' : 1,
+        'REMOTE_ADDR' : 1,
+        'AUTH_TYPE' : 1,
+        'REMOTE_USER' : 1,
+        'REMOTE_IDENT' : 1,
+        'CONTENT_TYPE' : 1,
         'CONTENT_LENGTH' : 1,
         'SERVER_URL': 1,
         }.has_key
@@ -62,7 +62,7 @@
 class HTTPRequest(BaseRequest):
     """\
     Model HTTP request data.
-    
+
     This object provides access to request data.  This includes, the
     input headers, form data, server data, and cookies.
 
@@ -150,7 +150,7 @@
         if protocol is None: protocol = oldprotocol
         if hostname is None: hostname = oldhostname
         if port is None: port = oldport
-        
+
         if (port is None or default_port[protocol] == port):
             host = hostname
         else:
@@ -258,7 +258,7 @@
 
         # _script and the other _names are meant for URL construction
         self._script = map(quote, filter(None, script.split( '/')))
-        
+
         while b and b[-1]=='/': b=b[:-1]
         p = b.rfind('/')
         if p >= 0: b=b[:p+1]
@@ -272,7 +272,7 @@
             if have_env('HTTPS') and (
                 environ['HTTPS'] == "on" or environ['HTTPS'] == "ON"):
                 protocol = 'https'
-            elif (have_env('SERVER_PORT_SECURE') and 
+            elif (have_env('SERVER_PORT_SECURE') and
                 environ['SERVER_PORT_SECURE'] == "1"):
                 protocol = 'https'
             else: protocol = 'http'
@@ -297,9 +297,9 @@
                 port = environ['SERVER_PORT']
             self.setServerURL(protocol=protocol, hostname=hostname, port=port)
             server_url = other['SERVER_URL']
-             
+
         if server_url[-1:]=='/': server_url=server_url[:-1]
-                        
+
         if b: self.base="%s/%s" % (server_url,b)
         else: self.base=server_url
         while script[:1]=='/': script=script[1:]
@@ -328,7 +328,7 @@
                     taintedcookies[k] = v
         self.cookies=cookies
         self.taintedcookies = taintedcookies
-    
+
     def processInputs(
         self,
         # "static" variables that we want to be local for speed
@@ -352,7 +352,7 @@
         response=self.response
         environ=self.environ
         method=environ.get('REQUEST_METHOD','GET')
-        
+
         if method != 'GET': fp=self.stdin
         else:               fp=None
 
@@ -385,9 +385,9 @@
             defaults={}
             tainteddefaults={}
             converter=seqf=None
-            
+
             for item in fslist:
-                
+
                 isFileUpload = 0
                 key=item.name
                 if (hasattr(item,'file') and hasattr(item,'filename')
@@ -415,7 +415,7 @@
                 # We'll do the search in two steps.  First, we'll
                 # do a string search, and then we'll check it with
                 # a re search.
-                
+
 
                 l=key.rfind(':')
                 if l >= 0:
@@ -427,8 +427,8 @@
                         type_name=key[l+1:]
                         key=key[:l]
                         c=get_converter(type_name, None)
-                        
-                        if c is not None: 
+
+                        if c is not None:
                             converter=c
                             converter_type = type_name
                             flags=flags|CONVERTED
@@ -457,7 +457,7 @@
                             if not item: flags=flags|EMPTY
                         elif has_codec(type_name):
                             character_encoding = type_name
-    
+
                         l=key.rfind(':')
                         if l < 0: break
                         mo=search_type(key,l)
@@ -465,7 +465,7 @@
                         else:  l = -1
 
 
-             
+
                 # Filter out special names from form:
                 if CGI_name(key) or key[:5]=='HTTP_': continue
 
@@ -476,7 +476,7 @@
 
                 if flags:
 
-                    # skip over empty fields    
+                    # skip over empty fields
                     if flags&EMPTY: continue
 
                     #Split the key and its attribute
@@ -494,7 +494,7 @@
                             raise ValueError(
                                 "%s is not a valid record attribute name" %
                                 escape(attr))
-                       
+
                     # defer conversion
                     if flags&CONVERTED:
                         try:
@@ -525,7 +525,7 @@
                                         tainted[i] = TaintedString(tainted[i])
                                 if not is_tainted:
                                     tainted = None
-                                
+
                         except:
                             if (not item and not (flags&DEFAULT) and
                                 defaults.has_key(key)):
@@ -541,8 +541,8 @@
                                     if flags&RECORDS:
                                         tainted = getattr(tainted[-1], attr)
                             else:
-                                raise                            
-                         
+                                raise
+
                     elif not isFileUpload and '<' in item:
                         # Flag potentially unsafe values
                         tainted = TaintedString(item)
@@ -607,7 +607,7 @@
                                         newrec = record()
                                         setattr(newrec, attr, copyitem)
                                         treclist.append(newrec)
-                            
+
                             if not hasattr(x,attr):
                                 #If the attribute does not
                                 #exist, setit
@@ -642,7 +642,7 @@
                             else:
                                 # it is not a sequence so
                                 # set the attribute
-                                setattr(b,attr,item)        
+                                setattr(b,attr,item)
 
                             # Store a tainted copy as well if necessary
                             if tainted:
@@ -682,7 +682,7 @@
                                     else:
                                         tainted_mapping[tainted_key] = [copied]
                                 tainted_mapping[tainted_key].append(tainted)
-                            
+
                             elif tainted_mapping.has_key(tainted_key):
                                 # We may already have encountered a tainted
                                 # value for this key, and the tainted_mapping
@@ -741,7 +741,7 @@
                 else:
                     # This branch is for case when no type was specified.
                     mapping_object = form
-    
+
                     if not isFileUpload and '<' in item:
                         tainted = TaintedString(item)
                     elif '<' in key:
@@ -761,7 +761,7 @@
                                 else:
                                     taintedform[tainted_key] = [copied]
                             taintedform[tainted_key].append(tainted)
-                        
+
                         elif taintedform.has_key(tainted_key):
                             # We may already have encountered a tainted value
                             # for this key, and the taintedform needs to hold
@@ -787,7 +787,7 @@
                 for key, value in defaults.items():
                     tainted_key = key
                     if '<' in key: tainted_key = TaintedString(key)
-                    
+
                     if not form.has_key(key):
                         # if the form does not have the key,
                         # set the default
@@ -795,7 +795,7 @@
 
                         if tainteddefaults.has_key(tainted_key):
                             taintedform[tainted_key] = \
-                                tainteddefaults[tainted_key] 
+                                tainteddefaults[tainted_key]
                     else:
                         #The form has the key
                         tdefault = tainteddefaults.get(tainted_key, value)
@@ -833,8 +833,8 @@
                                     # if the form dictionary doesn't have
                                     # the attribute, set it to the default
                                     setattr(r,k,v)
-                            form[key] = r    
-                                
+                            form[key] = r
+
                         elif isinstance(value, lt):
                             # the default value is a list
                             l = form[key]
@@ -892,20 +892,20 @@
                                 if isinstance(x, record):
                                     # if the x is a record
                                     for k, v in x.__dict__.items():
-                                        
+
                                         # loop through each
                                         # attribute and value in
                                         # the record
-                                        
+
                                         for y in l:
-                                            
+
                                             # loop through each
                                             # record in the form
                                             # list if it doesn't
                                             # have the attributes
                                             # in the default
                                             # dictionary, set them
-                                            
+
                                             if not hasattr(y, k):
                                                 setattr(y, k, v)
                                 else:
@@ -917,7 +917,7 @@
                             # The form has the key, the key is not mapped
                             # to a record or sequence so do nothing
                             pass
-                                
+
             # Convert to tuples
             if tuple_items:
                 for key in tuple_items.keys():
@@ -951,7 +951,7 @@
                                     # If the record has the attribute
                                     # convert it to a tuple and set it
                                     value=tuple(getattr(x,attr))
-                                    setattr(x,attr,value)          
+                                    setattr(x,attr,value)
 
                         # Do the same for the tainted counterpart
                         if taintedform.has_key(tainted_split_key):
@@ -966,20 +966,20 @@
                                         seq = tuple(seq)
                                         setattr(trec, attr, seq)
                     else:
-                        # the form does not have the split key 
+                        # the form does not have the split key
                         tainted_key = key
                         if '<' in key: tainted_key = TaintedString(key)
                         if form.has_key(key):
                             # if it has the original key, get the item
                             # convert it to a tuple
-                            item=form[key]  
+                            item=form[key]
                             item=tuple(form[key])
                             form[key]=item
 
                         if taintedform.has_key(tainted_key):
                             tainted = tuple(taintedform[tainted_key])
                             taintedform[tainted_key] = tainted
-                     
+
         if meth:
             if environ.has_key('PATH_INFO'):
                 path=environ['PATH_INFO']
@@ -1007,7 +1007,7 @@
         rsp=req.response
         req['PATH_INFO']=path
         object=None
-        
+
         # Try to traverse to get an object. Note that we call
         # the exception method on the response, but we don't
         # want to actually abort the current transaction
@@ -1036,10 +1036,10 @@
 
         req.close()
         return object
-        
+
 
     def clone(self):
-        # Return a clone of the current request object 
+        # Return a clone of the current request object
         # that may be used to perform object traversal.
         environ=self.environ.copy()
         environ['REQUEST_METHOD']='GET'
@@ -1073,8 +1073,8 @@
         Return a value for the required variable name.
         The value will be looked up from one of the request data
         categories. The search order is environment variables,
-        other variables, form data, and then cookies. 
-        
+        other variables, form data, and then cookies.
+
         """ #"
         other=self.other
         if other.has_key(key):
@@ -1246,14 +1246,14 @@
         for k,v in self.other.items():
             if k in ('PARENTS','RESPONSE'): continue
             result=result + row % (escape(k), escape(repr(v)))
-    
+
         for n in "0123456789":
             key = "URL%s"%n
-            try: result=result + row % (key, escape(self[key])) 
+            try: result=result + row % (key, escape(self[key]))
             except KeyError: pass
         for n in "0123456789":
             key = "BASE%s"%n
-            try: result=result + row % (key, escape(self[key])) 
+            try: result=result + row % (key, escape(self[key]))
             except KeyError: pass
 
         result=result+"</table><h3>environ</h3><table>"
@@ -1280,14 +1280,14 @@
         for k,v in self.other.items():
             if k in ('PARENTS','RESPONSE'): continue
             result=result + row % (k, repr(v))
-    
+
         for n in "0123456789":
             key = "URL%s"%n
-            try: result=result + row % (key, self[key]) 
+            try: result=result + row % (key, self[key])
             except KeyError: pass
         for n in "0123456789":
             key = "BASE%s"%n
-            try: result=result + row % (key, self[key]) 
+            try: result=result + row % (key, self[key])
             except KeyError: pass
 
         result=result+"\nENVIRON\n\n"
@@ -1408,9 +1408,9 @@
         # self.headers so that managed code can access them.
         try:    self.headers.__allow_access_to_unprotected_subobjects__ = 1
         except: pass
-        
+
     def __nonzero__(self):
-        """FileUpload objects are considered false if their 
+        """FileUpload objects are considered false if their
            filename is empty.
         """
         return not not self.filename
@@ -1453,8 +1453,8 @@
                 name  = mo_p.group(2)
                 value = mo_p.group(3)
 
-            else: 
-                return result 
+            else:
+                return result
 
     finally: release()
 
@@ -1475,11 +1475,11 @@
 
     def __getitem__(self, key):
         return self.__dict__[key]
-            
+
     def __str__(self):
         L1 = self.__dict__.items()
         L1.sort()
-        return ", ".join(map(lambda item: "%s: %s" % item, L1)) 
+        return ", ".join(map(lambda item: "%s: %s" % item, L1))
 
     def __repr__(self):
         #return repr( self.__dict__ )
@@ -1502,4 +1502,3 @@
 REC=RECORD|RECORDS
 EMPTY=16
 CONVERTED=32
-


=== Zope/lib/python/ZPublisher/HTTPResponse.py 1.67 => 1.68 ===
--- Zope/lib/python/ZPublisher/HTTPResponse.py:1.67	Wed Aug 14 12:45:53 2002
+++ Zope/lib/python/ZPublisher/HTTPResponse.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 #############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 '''CGI Response Output formatter
 
@@ -123,7 +123,7 @@
 class HTTPResponse(BaseResponse):
     """\
     An object representation of an HTTP response.
-    
+
     The Response type encapsulates all possible responses to HTTP
     requests.  Responses are normally created by the object publisher.
     A published object may recieve the response abject as an argument
@@ -151,7 +151,7 @@
     # 0 - no compression
     # 1 - compress if accept-encoding ok
     # 2 - ignore accept-encoding (i.e. force)
-    use_HTTP_content_compression = 0    
+    use_HTTP_content_compression = 0
 
     def __init__(self,body='',status=200,headers=None,
                  stdout=sys.stdout, stderr=sys.stderr,):
@@ -167,7 +167,7 @@
         if status == 200:
             self.status = 200
             self.errmsg = 'OK'
-            headers['status'] = "200 OK"      
+            headers['status'] = "200 OK"
         else:
             self.setStatus(status)
         self.base = ''
@@ -180,11 +180,11 @@
     def retry(self):
         """Return a response object to be used in a retry attempt
         """
-        
+
         # This implementation is a bit lame, because it assumes that
         # only stdout stderr were passed to the constructor. OTOH, I
         # think that that's all that is ever passed.
-        
+
         return self.__class__(stdout=self.stdout, stderr=self.stderr)
 
     _shutdown_flag = None
@@ -211,7 +211,7 @@
             # Don't change the response status.
             # It has already been determined.
             return
-                
+
         if type(status) is types.StringType:
             status = status.lower()
         if status_codes.has_key(status):
@@ -260,7 +260,7 @@
                 ):
         '''\
         Set the body of the response
-        
+
         Sets the return body equal to the (string) argument "body". Also
         updates the "content-length" return header.
 
@@ -269,13 +269,13 @@
 
         If the body is a 2-element tuple, then it will be treated
         as (title,body)
-        
+
         If is_error is true then the HTML will be formatted as a Zope error
         message instead of a generic HTML page.
         '''
         if not body:
             return self
-        
+
         if type(body) is types.TupleType and len(body) == 2:
             title,body = body
 
@@ -294,7 +294,7 @@
                 body = _encode_unicode(unicode(body))
 
         l = len(body)
-        if ((l < 200) and body[:1] == '<' and body.find('>') == l-1 and 
+        if ((l < 200) and body[:1] == '<' and body.find('>') == l-1 and
             bogus_str_search(body) is not None):
             self.notFoundError(body[1:-1])
         else:
@@ -329,7 +329,7 @@
         self.insertBase()
         if self.use_HTTP_content_compression and \
             not self.headers.get('content-encoding',None):
-            # use HTTP content encoding to compress body contents unless 
+            # use HTTP content encoding to compress body contents unless
             # this response already has another type of content encoding
             if content_type.split('/')[0] not in uncompressableMimeMajorTypes:
                 # only compress if not listed as uncompressable
@@ -348,10 +348,10 @@
                     self.setHeader('content-encoding','gzip')
                     if self.use_HTTP_content_compression == 1:
                         # use_HTTP_content_compression == 1 if force was
-                        # NOT used in enableHTTPCompression(). 
+                        # NOT used in enableHTTPCompression().
                         # If we forced it, then Accept-Encoding
                         # was ignored anyway, so cache should not
-                        # vary on it. Otherwise if not forced, cache should 
+                        # vary on it. Otherwise if not forced, cache should
                         # respect Accept-Encoding client header
                         self.appendHeader('Vary','Accept-Encoding')
         return self
@@ -406,7 +406,7 @@
                 self.use_HTTP_content_compression = 2
             else:
                 self.use_HTTP_content_compression = 1
-            
+
         return self.use_HTTP_content_compression
 
     def _encode_unicode(self,body,
@@ -470,7 +470,7 @@
     def expireCookie(self, name, **kw):
         '''\
         Cause an HTTP cookie to be removed from the browser
-        
+
         The response will include an HTTP header that will remove the cookie
         corresponding to "name" on the client, if one exists. This is
         accomplished by sending a new cookie with an expiration date
@@ -509,7 +509,7 @@
     def appendHeader(self, name, value, delimiter=","):
         '''\
         Append a value to a header.
-        
+
         Sets an HTTP return header "name" with value "value",
         appending it following a comma if there was a previous value
         set for the header. '''
@@ -539,7 +539,7 @@
                 text = subs[ent].join(text.split(ent))
 
         return text
-         
+
 
     def _traceback(self, t, v, tb, as_html=1):
         tb = format_exception(t, v, tb, as_html=as_html)
@@ -580,7 +580,7 @@
   </P>""" + \
   """
   <P><STRONG>%s</STRONG></P>
-  
+
   %s""" %(title,body) + \
   """
   <HR NOSHADE>
@@ -631,7 +631,7 @@
         raise 'BadRequest',self._error_html(
             "Invalid request",
             "The parameter, <em>%s</em>, " % name +
-            "was omitted from the request.<p>" + 
+            "was omitted from the request.<p>" +
             "Make sure to specify all required parameters, " +
             "and try the request again."
             )
@@ -777,7 +777,7 @@
             cookie_list.append(cookie)
 
         # Should really check size of cookies here!
-        
+
         return cookie_list
 
     def __str__(self,
@@ -829,7 +829,7 @@
         cookies on the response object.
 
         Note that published objects must not generate any errors
-        after beginning stream-oriented output. 
+        after beginning stream-oriented output.
 
         """
         if not self._wrote:
@@ -838,5 +838,3 @@
             self.stdout.flush()
 
         self.stdout.write(data)
-
-


=== Zope/lib/python/ZPublisher/Publish.py 1.156 => 1.157 ===
--- Zope/lib/python/ZPublisher/Publish.py:1.156	Mon Apr 15 16:58:28 2002
+++ Zope/lib/python/ZPublisher/Publish.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __doc__="""Python Object Publisher -- Publish Python objects on web servers
 
@@ -64,47 +64,47 @@
 
         request_get=request.get
         response=request.response
-    
+
         # First check for "cancel" redirect:
         cancel=''
         if request_get('SUBMIT','').strip().lower()=='cancel':
             cancel=request_get('CANCEL_ACTION','')
             if cancel: raise 'Redirect', cancel
-    
+
         after_list[0]=bobo_after
         if debug_mode: response.debug_mode=debug_mode
         if realm and not request.get('REMOTE_USER',None):
             response.realm=realm
-    
+
         if bobo_before is not None:
             bobo_before()
-    
+
         # Get a nice clean path list:
         path=request_get('PATH_INFO').strip()
-    
+
         request['PARENTS']=parents=[object]
-        
+
         if transactions_manager: transactions_manager.begin()
-    
+
         object=request.traverse(path, validated_hook=validated_hook)
-    
+
         if transactions_manager:
             transactions_manager.recordMetaData(object, request)
-    
+
         result=mapply(object, request.args, request,
                       call_object,1,
-                      missing_name, 
+                      missing_name,
                       dont_publish_class,
                       request, bind=1)
-    
+
         if result is not response: response.setBody(result)
-    
+
         if transactions_manager: transactions_manager.commit()
 
         return response
     except:
         if transactions_manager: transactions_manager.abort()
-        
+
         if err_hook is not None:
             if parents: parents=parents[0]
             try:
@@ -127,7 +127,7 @@
                     return publish(newrequest, module_name, after_list, debug)
                 finally:
                     newrequest.close()
-                    
+
         else: raise
 
 
@@ -226,7 +226,7 @@
 
                 z1 = os.environ.get('Z_DEBUG_MODE','')
                 z2 = os.environ.get('BOBO_DEBUG_MODE','')
-            
+
                 if z1.lower() in ('yes','y') or z1.isdigit():
                     debug_mode = 1
                 elif z2.lower() in ('yes','y') or z2.isdigit():
@@ -264,7 +264,7 @@
                    error_hook, validated_hook, transactions_manager)
 
             modules[module_name]=modules[module_name+'.cgi']=info
-            
+
             return info
         except:
             t,v,tb=sys.exc_info()
@@ -287,7 +287,7 @@
         auth_user=request_get('AUTHENTICATED_USER',None)
         if auth_user is not None:
             T.setUser(auth_user, request_get('AUTHENTICATION_PATH'))
-        
+
 
 # ZPublisher profiler support
 # ---------------------------
@@ -301,17 +301,17 @@
     _pfunc=publish_module
     _pstat=None
 
-    def pm(module_name, stdin, stdout, stderr, 
+    def pm(module_name, stdin, stdout, stderr,
            environ, debug, request, response):
         try:
-            r=_pfunc(module_name, stdin=stdin, stdout=stdout, 
-                     stderr=stderr, environ=environ, debug=debug, 
+            r=_pfunc(module_name, stdin=stdin, stdout=stdout,
+                     stderr=stderr, environ=environ, debug=debug,
                      request=request, response=response)
         except: r=None
         sys._pr_=r
 
-    def publish_module(module_name, stdin=sys.stdin, stdout=sys.stdout, 
-                       stderr=sys.stderr, environ=os.environ, debug=0, 
+    def publish_module(module_name, stdin=sys.stdin, stdout=sys.stdout,
+                       stderr=sys.stderr, environ=os.environ, debug=0,
                        request=None, response=None):
         global _pstat
         _plock.acquire()
@@ -320,11 +320,11 @@
                 path_info=request.get('PATH_INFO')
             else: path_info=environ.get('PATH_INFO')
             if path_info[-14:]=='manage_profile':
-                return _pfunc(module_name, stdin=stdin, stdout=stdout, 
-                              stderr=stderr, environ=environ, debug=debug, 
+                return _pfunc(module_name, stdin=stdin, stdout=stdout,
+                              stderr=stderr, environ=environ, debug=debug,
                               request=request, response=response)
             pobj=profile.Profile()
-            pobj.runcall(pm, module_name, stdin, stdout, stderr, 
+            pobj.runcall(pm, module_name, stdin, stdout, stderr,
                          environ, debug, request, response)
             result=sys._pr_
             pobj.create_stats()
@@ -351,6 +351,3 @@
             except: pass
             raise error[0], error[1], error[2]
         return result
-
-
-


=== Zope/lib/python/ZPublisher/Request.py 1.9 => 1.10 ===
--- Zope/lib/python/ZPublisher/Request.py:1.9	Wed Nov 28 10:51:20 2001
+++ Zope/lib/python/ZPublisher/Request.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 import HTTPRequest
 Request=HTTPRequest.HTTPRequest


=== Zope/lib/python/ZPublisher/Response.py 1.50 => 1.51 ===
--- Zope/lib/python/ZPublisher/Response.py:1.50	Wed Nov 28 10:51:21 2001
+++ Zope/lib/python/ZPublisher/Response.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 import HTTPResponse
 Response=HTTPResponse.HTTPResponse


=== Zope/lib/python/ZPublisher/TaintedString.py 1.1 => 1.2 ===
--- Zope/lib/python/ZPublisher/TaintedString.py:1.1	Thu Aug  1 12:00:41 2002
+++ Zope/lib/python/ZPublisher/TaintedString.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 
 __version__='$Revision$'[11:-2]
@@ -44,7 +44,7 @@
         if '<' in v:
             v = self.__class__(v)
         return v
-            
+
     def __getslice__(self, i, j):
         i = max(i, 0)
         j = max(j, 0)
@@ -141,4 +141,3 @@
 
 for f in oneArgWrappedMethods:
     setattr(TaintedString, f, createOneArgWrapper(f))
-


=== Zope/lib/python/ZPublisher/Test.py 1.39 => 1.40 ===
--- Zope/lib/python/ZPublisher/Test.py:1.39	Wed Jan  2 10:56:04 2002
+++ Zope/lib/python/ZPublisher/Test.py	Wed Aug 14 18:09:40 2002
@@ -7,14 +7,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 
 __doc__='''Command-line Bobo
@@ -25,7 +25,7 @@
 
    where:
 
-   module_path -- is a full path to a published module 
+   module_path -- is a full path to a published module
 
    path_info -- Is the information after the module name that would
          normally be specified in a GET URL, including a query string.
@@ -33,22 +33,22 @@
 Description
 
    The command-line interface to Bobo provides a handy way to test,
-   debug, and profile Bobo without a web server.  
+   debug, and profile Bobo without a web server.
 
 Options
 
    -u username:password        -- Supply HTTP authorization information
 
    -e name=value               -- Supply environment variables.  Use a
-                                  seperate -e option for each variable 
+                                  seperate -e option for each variable
                                   specified.
 
    -p profiler_data_file       -- Run under profiler control,
-                                  generating the profiler 
+                                  generating the profiler
                                   data file, profiler_data_file.
 
    -t                          -- Compute the time required to
-                                  complete a request, in 
+                                  complete a request, in
                                   milliseconds.
 
    -r n                        -- Specify a repeat count for timing or
@@ -134,7 +134,7 @@
             env[val[:opt]]=val[opt+1:]
 
     if (debug or 0)+(timeit or 0)+(profile and 1 or 0) > 1:
-        raise 'Invalid options', 'only one of -p, -t, and -d are allowed' 
+        raise 'Invalid options', 'only one of -p, -t, and -d are allowed'
 
     module=args[0]
 
@@ -342,7 +342,7 @@
             if isinstance(b, TupleType):
                 apply(db.set_break,b)
             else:
-                fbreak(db,b)    
+                fbreak(db,b)
 
         db.prompt='pdb> '
         # db.set_continue()
@@ -368,9 +368,9 @@
         publish_module_pm(file, environ=env, stdout=stdout, extra=extra)
         print '\n%s\n' % ('_'*60)
     else:
-        if silent: 
+        if silent:
             stdout=open('/dev/null','w')
-        else: 
+        else:
             if fp and hasattr(fp,'write'):
                 stdout = fp
             else:


=== Zope/lib/python/ZPublisher/__init__.py 1.11 => 1.12 ===
--- Zope/lib/python/ZPublisher/__init__.py:1.11	Wed Nov 28 10:51:21 2001
+++ Zope/lib/python/ZPublisher/__init__.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __version__='$Revision$'[11:-2]
 


=== Zope/lib/python/ZPublisher/cgi_hotfix.py 1.2 => 1.3 ===
--- Zope/lib/python/ZPublisher/cgi_hotfix.py:1.2	Wed Jul 25 15:38:28 2001
+++ Zope/lib/python/ZPublisher/cgi_hotfix.py	Wed Aug 14 18:09:40 2002
@@ -7,7 +7,7 @@
         """Internal: read a part that is itself multipart."""
         ib = self.innerboundary
         if not valid_boundary(ib):
-            raise ValueError, ('Invalid boundary in multipart form: %s' 
+            raise ValueError, ('Invalid boundary in multipart form: %s'
                                % `ib`)
         self.list = []
         klass = self.FieldStorageClass or self.__class__


=== Zope/lib/python/ZPublisher/mapply.py 1.5 => 1.6 ===
--- Zope/lib/python/ZPublisher/mapply.py:1.5	Wed Nov 28 10:51:21 2001
+++ Zope/lib/python/ZPublisher/mapply.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 """Provide an apply-like facility that works with any mapping object
 """
@@ -21,7 +21,7 @@
     raise TypeError, 'argument %s was ommitted' % name
 
 def default_handle_class(klass, context):
-    if hasattr(klass,'__init__'): 
+    if hasattr(klass,'__init__'):
         f=klass.__init__.im_func
         c=f.func_code
         names=c.co_varnames[1:c.co_argcount]
@@ -50,7 +50,7 @@
                     im=1
                 elif not hasattr(f,'func_defaults') and maybe: return object
             elif maybe: return object
-    
+
         if im:
             f=f.im_func
             c=f.func_code


=== Zope/lib/python/ZPublisher/maybe_lock.py 1.3 => 1.4 ===
--- Zope/lib/python/ZPublisher/maybe_lock.py:1.3	Wed Nov 28 10:51:21 2001
+++ Zope/lib/python/ZPublisher/maybe_lock.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 __version__='$Revision$'[11:-2]
 


=== Zope/lib/python/ZPublisher/xmlrpc.py 1.11 => 1.12 ===
--- Zope/lib/python/ZPublisher/xmlrpc.py:1.11	Fri May 31 08:31:08 2002
+++ Zope/lib/python/ZPublisher/xmlrpc.py	Wed Aug 14 18:09:40 2002
@@ -1,14 +1,14 @@
 ##############################################################################
 #
 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE
-# 
+#
 ##############################################################################
 """XML-RPC support module
 
@@ -28,9 +28,9 @@
 
     The data is a string.
     """
-    # 
+    #
     # For example, with the input:
-    #     
+    #
     #   <?xml version="1.0"?>
     #   <methodCall>
     #      <methodName>examples.getStateName</methodName>
@@ -40,9 +40,9 @@
     #            </param>
     #         </params>
     #      </methodCall>
-    # 
+    #
     # the function should return:
-    # 
+    #
     #     ('examples.getStateName', (41,))
     params, method = xmlrpclib.loads(data)
     # Translate '.' to '/' in meth to represent object traversal.
@@ -53,7 +53,7 @@
 #
 # def response(anHTTPResponse):
 #     """Return a valid ZPublisher response object
-# 
+#
 #     Use data already gathered by the existing response.
 #     The new response will replace the existing response.
 #     """
@@ -62,8 +62,8 @@
 #     r=Response()
 #     r.__dict__.update(anHTTPResponse.__dict__)
 #     return r
-    
-    
+
+
 
 ########################################################################
 # Possible implementation helpers:
@@ -91,7 +91,7 @@
     def __getattr__(self, name): return getattr(self._real, name)
     def __setattr__(self, name, v): return setattr(self._real, name, v)
     def __delattr__(self, name): return delattr(self._real, name)
-    
+
     def setBody(self, body, title='', is_error=0, bogus_str_search=None):
         if isinstance(body, xmlrpclib.Fault):
             # Convert Fault object to XML-RPC response.