wsgi: double content-length bug and restore minimum_chunk_size logic
This commit is contained in:
		@@ -177,8 +177,6 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
        start = time.time()
 | 
			
		||||
        headers_set = []
 | 
			
		||||
        headers_sent = []
 | 
			
		||||
        # set of lowercase header names that were sent
 | 
			
		||||
        header_dict = {}
 | 
			
		||||
 | 
			
		||||
        wfile = self.wfile
 | 
			
		||||
        result = None
 | 
			
		||||
@@ -193,19 +191,18 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
            elif not headers_sent:
 | 
			
		||||
                status, response_headers = headers_set
 | 
			
		||||
                headers_sent.append(1)
 | 
			
		||||
                for k, v in response_headers:
 | 
			
		||||
                    header_dict[k.lower()] = k
 | 
			
		||||
                header_list = [header[0].lower() for header in response_headers]
 | 
			
		||||
                towrite.append('%s %s\r\n' % (self.protocol_version, status))
 | 
			
		||||
                for header in response_headers:
 | 
			
		||||
                    towrite.append('%s: %s\r\n' % header)
 | 
			
		||||
 | 
			
		||||
                # send Date header?
 | 
			
		||||
                if 'date' not in header_dict:
 | 
			
		||||
                if 'date' not in header_list:
 | 
			
		||||
                    towrite.append('Date: %s\r\n' % (format_date_time(time.time()),))
 | 
			
		||||
                if self.request_version == 'HTTP/1.0':
 | 
			
		||||
                    towrite.append('Connection: close\r\n')
 | 
			
		||||
                    self.close_connection = 1
 | 
			
		||||
                elif 'content-length' not in header_dict:
 | 
			
		||||
                elif 'content-length' not in header_list:
 | 
			
		||||
                    use_chunked[0] = True
 | 
			
		||||
                    towrite.append('Transfer-Encoding: chunked\r\n')
 | 
			
		||||
                towrite.append('\r\n')
 | 
			
		||||
@@ -249,16 +246,19 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
 | 
			
		||||
        try:
 | 
			
		||||
            try:
 | 
			
		||||
                result = self.application(self.environ, start_response)
 | 
			
		||||
                if not headers_sent and hasattr(result, '__len__'):
 | 
			
		||||
                    headers_set[1].append(('content-length', str(sum(map(len, result)))))
 | 
			
		||||
                if not headers_sent and hasattr(result, '__len__') and \
 | 
			
		||||
                        'Content-Length' not in [h for h, v in headers_set[1]]:
 | 
			
		||||
                    headers_set[1].append(('Content-Length', str(sum(map(len, result)))))
 | 
			
		||||
                towrite = []
 | 
			
		||||
                for data in result:
 | 
			
		||||
                    if data:
 | 
			
		||||
                        write(data)
 | 
			
		||||
                if not headers_sent:
 | 
			
		||||
                    towrite.append(data)
 | 
			
		||||
                    if sum(map(len, towrite)) >= self.minimum_chunk_size:
 | 
			
		||||
                        write(''.join(towrite))
 | 
			
		||||
                        towrite = []
 | 
			
		||||
                if towrite:
 | 
			
		||||
                    write(''.join(towrite))
 | 
			
		||||
                if not headers_sent or use_chunked[0]:
 | 
			
		||||
                    write('')
 | 
			
		||||
                if use_chunked[0]:
 | 
			
		||||
                    wfile.write('0\r\n\r\n')
 | 
			
		||||
            except Exception, e:
 | 
			
		||||
                self.close_connection = 1
 | 
			
		||||
                exc = traceback.format_exc()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user