Log message for revision 106988: PEP 8; import normalization; acommodate new internals of ZPublisher.HTTPRespose.
Changed: U Zope/branches/tseaver-fix_wsgi/src/ZServer/HTTPResponse.py U Zope/branches/tseaver-fix_wsgi/src/ZServer/tests/test_responses.py -=- Modified: Zope/branches/tseaver-fix_wsgi/src/ZServer/HTTPResponse.py =================================================================== --- Zope/branches/tseaver-fix_wsgi/src/ZServer/HTTPResponse.py 2009-12-23 01:52:01 UTC (rev 106987) +++ Zope/branches/tseaver-fix_wsgi/src/ZServer/HTTPResponse.py 2009-12-23 02:14:35 UTC (rev 106988) @@ -17,58 +17,63 @@ and logging duties. """ -import time, re, sys, tempfile +import asyncore from cStringIO import StringIO +import re +import tempfile import thread -from ZPublisher.HTTPResponse import HTTPResponse -from ZPublisher.Iterators import IStreamIterator -from medusa.http_date import build_http_date -from PubCore.ZEvent import Wakeup -from medusa.producers import hooked_producer -from medusa import http_server -import asyncore -from Producers import ShutdownProducer, LoggingProducer, CallbackProducer, \ - file_part_producer, file_close_producer, iterator_producer -import DebugLogger +import time +from ZPublisher.HTTPResponse import HTTPResponse # WTF? +from ZPublisher.Iterators import IStreamIterator # WTF? +from ZServer.medusa.http_date import build_http_date +from ZServer.PubCore.ZEvent import Wakeup +from ZServer.medusa import http_server + +from ZServer.Producers import ShutdownProducer +from ZServer.Producers import LoggingProducer +from ZServer.Producers import CallbackProducer +from ZServer.Producers import file_part_producer +from ZServer.Producers import file_close_producer +from ZServer.Producers import iterator_producer +from ZServer.DebugLogger import log + + class ZServerHTTPResponse(HTTPResponse): "Used to push data into a channel's producer fifo" # Set this value to 1 if streaming output in # HTTP/1.1 should use chunked encoding - http_chunk=1 - http_chunk_size=1024 + http_chunk = 1 + http_chunk_size = 1024 # defaults - _http_version='1.0' - _http_connection='close' - _server_version='Zope/2.0 ZServer/2.0' + _http_version = '1.0' + _http_connection = 'close' + _server_version = 'Zope/2.0 ZServer/2.0' # using streaming response - _streaming=0 + _streaming = 0 # using chunking transfer-encoding - _chunking=0 + _chunking = 0 _bodyproducer = None - def __str__(self, - html_search=re.compile('<html>',re.I).search, - ): + def __str__(self): if self._wrote: if self._chunking: return '0\r\n\r\n' else: return '' - headers=self.headers - body=self.body + headers = self.headers + body = self.body # set 204 (no content) status if 200 and response is empty # and not streaming - if not headers.has_key('content-type') and \ - not headers.has_key('content-length') and \ - not self._streaming and \ - self.status == 200: + if ('content-type' not in headers and + 'content-length' not in headers and + not self._streaming and self.status == 200): self.setStatus('nocontent') if self.status in (100, 101, 102, 204, 304): @@ -82,65 +87,65 @@ elif not headers.has_key('content-length') and not self._streaming: self.setHeader('content-length', len(body)) - headersl=[] - append=headersl.append + chunks = [] + append = chunks.append - status=headers.get('status', '200 OK') # status header must come first. - append("HTTP/%s %s" % (self._http_version or '1.0' , status)) - if headers.has_key('status'): - del headers['status'] + append("HTTP/%s %d %s" % (self._http_version or '1.0', + self.status, self.errmsg)) # add zserver headers append('Server: %s' % self._server_version) append('Date: %s' % build_http_date(time.time())) - if self._http_version=='1.0': - if self._http_connection=='keep-alive': + if self._http_version == '1.0': + if self._http_connection == 'keep-alive': self.setHeader('Connection','Keep-Alive') else: self.setHeader('Connection','close') # Close the connection if we have been asked to. # Use chunking if streaming output. - if self._http_version=='1.1': - if self._http_connection=='close': + if self._http_version == '1.1': + if self._http_connection == 'close': self.setHeader('Connection','close') elif (not self.headers.has_key('content-length') and self.http_chunk and self._streaming): self.setHeader('Transfer-Encoding','chunked') - self._chunking=1 + self._chunking = 1 headers = headers.items() - for line in self.accumulated_headers.splitlines(): + for line in self.accumulated_headers: if line[0] == '\t': headers[-1][1] += '\n' + line continue headers.append(line.split(': ', 1)) for key, val in headers: - if key.lower()==key: + if key.lower() == key: # only change non-literal header names - key="%s%s" % (key[:1].upper(), key[1:]) - start=0 - l=key.find('-',start) + key = "%s%s" % (key[:1].upper(), key[1:]) + start = 0 + l = key.find('-',start) while l >= start: - key="%s-%s%s" % (key[:l],key[l+1:l+2].upper(),key[l+2:]) - start=l+1 - l=key.find('-',start) + key = "%s-%s%s" % (key[:l], + key[l+1:l+2].upper(), + key[l+2:]) + start = l + 1 + l = key.find('-', start) val = val.replace('\n\t', '\r\n\t') append("%s: %s" % (key, val)) if self.cookies: - headersl.extend(self._cookie_list()) + chunks.extend(self._cookie_list()) append('') append(body) - return "\r\n".join(headersl) + return "\r\n".join(chunks) - _tempfile=None - _templock=None - _tempstart=0 + _tempfile = None + _templock = None + _tempstart = 0 def write(self,data): """\ @@ -162,42 +167,42 @@ if type(data) != type(''): raise TypeError('Value must be a string') - stdout=self.stdout + stdout = self.stdout if not self._wrote: - l=self.headers.get('content-length', None) + l = self.headers.get('content-length', None) if l is not None: try: - if type(l) is type(''): l=int(l) + if type(l) is type(''): l = int(l) if l > 128000: - self._tempfile=tempfile.TemporaryFile() - self._templock=thread.allocate_lock() + self._tempfile = tempfile.TemporaryFile() + self._templock = thread.allocate_lock() except: pass - self._streaming=1 + self._streaming = 1 stdout.write(str(self)) - self._wrote=1 + self._wrote = 1 if not data: return if self._chunking: data = '%x\r\n%s\r\n' % (len(data),data) - l=len(data) + l = len(data) - t=self._tempfile + t = self._tempfile if t is None or l<200: stdout.write(data) else: - b=self._tempstart - e=b+l + b = self._tempstart + e = b + l self._templock.acquire() try: t.seek(b) t.write(data) finally: self._templock.release() - self._tempstart=e + self._tempstart = e stdout.write(file_part_producer(t,self._templock,b,e), l) _retried_response = None @@ -209,18 +214,18 @@ finally: self._retried_response = None return - stdout=self.stdout + stdout = self.stdout - t=self._tempfile + t = self._tempfile if t is not None: stdout.write(file_close_producer(t), 0) - self._tempfile=None + self._tempfile = None stdout.finish(self) stdout.close() - self.stdout=None # need to break cycle? - self._request=None + self.stdout = None # need to break cycle? + self._request = None def retry(self): """Return a request object to be used in a retry attempt @@ -229,11 +234,11 @@ # only stdout stderr were passed to the constructor. OTOH, I # think that that's all that is ever passed. - response=self.__class__(stdout=self.stdout, stderr=self.stderr) - response.headers=self.headers - response._http_version=self._http_version - response._http_connection=self._http_connection - response._server_version=self._server_version + response = self.__class__(stdout=self.stdout, stderr=self.stderr) + response.headers = self.headers + response._http_version = self._http_version + response._http_connection = self._http_connection + response._server_version = self._server_version self._retried_response = response return response @@ -267,28 +272,28 @@ restrict access to channel to the push method only.""" def __init__(self, request): - self._channel=request.channel - self._request=request - self._shutdown=0 - self._close=0 - self._bytes=0 + self._channel = request.channel + self._request = request + self._shutdown = 0 + self._close = 0 + self._bytes = 0 def write(self, text, l=None): if self._channel.closed: return - if l is None: l=len(text) - self._bytes=self._bytes + l + if l is None: l = len(text) + self._bytes = self._bytes + l self._channel.push(text,0) Wakeup() def close(self): - DebugLogger.log('A', id(self._request), + log('A', id(self._request), '%s %s' % (self._request.reply_code, self._bytes)) if not self._channel.closed: self._channel.push(LoggingProducer(self._request, self._bytes), 0) self._channel.push(CallbackProducer(self._channel.done), 0) self._channel.push(CallbackProducer( - lambda t=('E', id(self._request)): apply(DebugLogger.log, t)), 0) + lambda t=('E', id(self._request)): apply(log, t)), 0) if self._shutdown: self._channel.push(ShutdownProducer(), 0) Wakeup() @@ -299,15 +304,15 @@ # channel closed too soon self._request.log(self._bytes) - DebugLogger.log('E', id(self._request)) + log('E', id(self._request)) if self._shutdown: Wakeup(lambda: asyncore.close_all()) else: Wakeup() - self._channel=None #need to break cycles? - self._request=None + self._channel = None #need to break cycles? + self._request = None def flush(self): pass # yeah, whatever @@ -316,8 +321,8 @@ self._shutdown = 1 if response.headers.get('connection','') == 'close' or \ response.headers.get('Connection','') == 'close': - self._close=1 - self._request.reply_code=response.status + self._close = 1 + self._request.reply_code = response.status def start_response(self, status, headers, exc_info=None): # Used for WSGI @@ -337,9 +342,10 @@ "Simple http response factory" # should this be integrated into the HTTPResponse constructor? - response=ZServerHTTPResponse(stdout=ChannelPipe(request), stderr=StringIO()) - response._http_version=request.version - if request.version=='1.0' and is_proxying_match(request.request): + response = ZServerHTTPResponse(stdout=ChannelPipe(request), + stderr=StringIO()) + response._http_version = request.version + if request.version == '1.0' and is_proxying_match(request.request): # a request that was made as if this zope was an http 1.0 proxy. # that means we have to use some slightly different http # headers to manage persistent connections. @@ -349,5 +355,5 @@ connection_re = http_server.CONNECTION response._http_connection = http_server.get_header(connection_re, request.header).lower() - response._server_version=request.channel.server.SERVER_IDENT + response._server_version = request.channel.server.SERVER_IDENT return response Modified: Zope/branches/tseaver-fix_wsgi/src/ZServer/tests/test_responses.py =================================================================== --- Zope/branches/tseaver-fix_wsgi/src/ZServer/tests/test_responses.py 2009-12-23 01:52:01 UTC (rev 106987) +++ Zope/branches/tseaver-fix_wsgi/src/ZServer/tests/test_responses.py 2009-12-23 02:14:35 UTC (rev 106988) @@ -107,7 +107,9 @@ 'Title-Cased': 'bar', 'mixed-CasED': 'spam', 'multilined': 'eggs\n\tham'} - response.accumulated_headers = 'foo-bar: bar\n\tbaz\nFoo-bar: monty\n' + response.accumulated_headers = ['foo-bar: bar', + '\tbaz', + 'Foo-bar: monty'] response.cookies = dict(foo=dict(value='bar')) response.body = 'A body\nwith multiple lines\n' _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org https://mail.zope.org/mailman/listinfo/zope-checkins