Ticket #376: django-modpython.3.patch
| File django-modpython.3.patch, 4.9 kB (added by Andrew Fedorov, 10 months ago) |
|---|
-
django/core/handlers/modpython.py
old new 11 11 # settings) until after ModPythonHandler has been called; otherwise os.environ 12 12 # won't be set up correctly (with respect to settings). 13 13 14 # NOTE: Use only has_key() and keys() methods of Table objects to be compatible 15 # with mod_python2 16 14 17 class ModPythonRequest(http.HttpRequest): 15 18 def __init__(self, req): 16 19 self._req = req … … 43 46 44 47 def is_secure(self): 45 48 # Note: modpython 3.2.10+ has req.is_https(), but we need to support previous versions 46 return 'HTTPS' in self._req.subprocess_envand self._req.subprocess_env['HTTPS'] == 'on'49 return self._req.subprocess_env.has_key('HTTPS') and self._req.subprocess_env['HTTPS'] == 'on' 47 50 48 51 def _load_post_and_files(self): 49 52 "Populates self._post and self._files" 50 if 'content-type' in self._req.headers_inand self._req.headers_in['content-type'].startswith('multipart'):53 if self._req.headers_in.has_key('content-type') and self._req.headers_in['content-type'].startswith('multipart'): 51 54 self._post, self._files = http.parse_file_upload(self._req.headers_in, self.raw_post_data) 52 55 else: 53 56 self._post, self._files = http.QueryDict(self.raw_post_data, encoding=self._encoding), datastructures.MultiValueDict() … … 75 78 76 79 def _get_cookies(self): 77 80 if not hasattr(self, '_cookies'): 78 self._cookies = http.parse_cookie(self._req.headers_in.get('cookie', '')) 81 # In mod_python2 Table object does not have get() method 82 if not self._req.headers_in.has_key('cookie'): 83 self._req.headers_in['cookie'] = '' 84 self._cookies = http.parse_cookie(self._req.headers_in['cookie']) 79 85 return self._cookies 80 86 81 87 def _set_cookies(self, cookies): … … 89 95 def _get_meta(self): 90 96 "Lazy loader that returns self.META dictionary" 91 97 if not hasattr(self, '_meta'): 98 # ap_uath_type and user are members of request object in 99 # mod_python3, but members of request.connection in mod_python2 100 if hasattr(self._req, 'ap_auth_type'): 101 auth_type = self._req.ap_auth_type 102 elif hasattr(self._req.connection, 'ap_auth_type'): 103 auth_type = self._req.connection.ap_auth_type 104 else: 105 auth_type = None 106 if hasattr(self._req, 'user'): 107 user = self._req.user 108 elif hasattr(self._req.connection, 'user'): 109 user = self._req.connection.user 110 else: 111 user = None 92 112 self._meta = { 93 'AUTH_TYPE': self._req.ap_auth_type,113 'AUTH_TYPE': auth_type, 94 114 'CONTENT_LENGTH': self._req.clength, # This may be wrong 95 115 'CONTENT_TYPE': self._req.content_type, # This may be wrong 96 116 'GATEWAY_INTERFACE': 'CGI/1.1', … … 100 120 'REMOTE_ADDR': self._req.connection.remote_ip, 101 121 'REMOTE_HOST': None, # DNS lookups not supported 102 122 'REMOTE_IDENT': self._req.connection.remote_logname, 103 'REMOTE_USER': self._req.user,123 'REMOTE_USER': user, 104 124 'REQUEST_METHOD': self._req.method, 105 125 'SCRIPT_NAME': None, # Not supported 106 126 'SERVER_NAME': self._req.server.server_hostname, … … 108 128 'SERVER_PROTOCOL': self._req.protocol, 109 129 'SERVER_SOFTWARE': 'mod_python' 110 130 } 111 for key , value in self._req.headers_in.items():112 key = 'HTTP_' + key.upper().replace('-', '_')113 self._meta[ key] = value131 for key in self._req.headers_in.keys(): 132 meta_key = 'HTTP_' + key.upper().replace('-', '_') 133 self._meta[meta_key] = self._req.headers_in[key] 114 134 return self._meta 115 135 116 136 def _get_raw_post_data(self): … … 166 186 req.headers_out.add('Set-Cookie', c.output(header='')) 167 187 req.status = response.status_code 168 188 try: 189 if hasattr(req, 'send_http_header'): 190 # This method exists only in mod_python2 and must be called 191 # before any data transfer 192 req.send_http_header() 169 193 for chunk in response: 170 194 req.write(chunk) 171 195 finally:
