Allow customizing the minimum chunk size the server will send. Useful for writing streaming transfer-coding: chunked comet servers
This commit is contained in:
@@ -87,10 +87,12 @@ class Input(object):
|
|||||||
|
|
||||||
|
|
||||||
MAX_REQUEST_LINE = 8192
|
MAX_REQUEST_LINE = 8192
|
||||||
|
MINIMUM_CHUNK_SIZE = 4096
|
||||||
|
|
||||||
|
|
||||||
class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
protocol_version = 'HTTP/1.1'
|
protocol_version = 'HTTP/1.1'
|
||||||
|
minimum_chunk_size = MINIMUM_CHUNK_SIZE
|
||||||
|
|
||||||
def handle_one_request(self):
|
def handle_one_request(self):
|
||||||
if self.server.max_http_version:
|
if self.server.max_http_version:
|
||||||
@@ -181,6 +183,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
towrite.append(data)
|
towrite.append(data)
|
||||||
joined = ''.join(towrite)
|
joined = ''.join(towrite)
|
||||||
length[0] = length[0] + len(joined)
|
length[0] = length[0] + len(joined)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
_write(joined)
|
_write(joined)
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
@@ -212,7 +215,6 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
start_response("500 Internal Server Error", [('Content-type', 'text/plain')])
|
start_response("500 Internal Server Error", [('Content-type', 'text/plain')])
|
||||||
write(exc)
|
write(exc)
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
num_blocks = len(result)
|
num_blocks = len(result)
|
||||||
except (TypeError, AttributeError, NotImplementedError):
|
except (TypeError, AttributeError, NotImplementedError):
|
||||||
@@ -225,7 +227,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
for data in result:
|
for data in result:
|
||||||
if data:
|
if data:
|
||||||
towrite.append(data)
|
towrite.append(data)
|
||||||
if use_chunked and sum(map(len, towrite)) > 4096:
|
if use_chunked and sum(map(len, towrite)) > self.minimum_chunk_size:
|
||||||
write(''.join(towrite))
|
write(''.join(towrite))
|
||||||
del towrite[:]
|
del towrite[:]
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
@@ -317,7 +319,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
|
|
||||||
class Server(BaseHTTPServer.HTTPServer):
|
class Server(BaseHTTPServer.HTTPServer):
|
||||||
def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol):
|
def __init__(self, socket, address, app, log=None, environ=None, max_http_version=None, protocol=HttpProtocol, minimum_chunk_size=None):
|
||||||
self.outstanding_requests = 0
|
self.outstanding_requests = 0
|
||||||
self.socket = socket
|
self.socket = socket
|
||||||
self.address = address
|
self.address = address
|
||||||
@@ -330,6 +332,8 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
self.max_http_version = max_http_version
|
self.max_http_version = max_http_version
|
||||||
self.protocol = protocol
|
self.protocol = protocol
|
||||||
self.pid = os.getpid()
|
self.pid = os.getpid()
|
||||||
|
if minimum_chunk_size is not None:
|
||||||
|
protocol.minimum_chunk_size = minimum_chunk_size
|
||||||
|
|
||||||
def get_environ(self):
|
def get_environ(self):
|
||||||
socket = self.socket
|
socket = self.socket
|
||||||
@@ -353,8 +357,8 @@ class Server(BaseHTTPServer.HTTPServer):
|
|||||||
self.log.write(message + '\n')
|
self.log.write(message + '\n')
|
||||||
|
|
||||||
|
|
||||||
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION, protocol=HttpProtocol, server_event=None):
|
def server(sock, site, log=None, environ=None, max_size=None, max_http_version=DEFAULT_MAX_HTTP_VERSION, protocol=HttpProtocol, server_event=None, minimum_chunk_size=None):
|
||||||
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version, protocol=protocol)
|
serv = Server(sock, sock.getsockname(), site, log, environ=None, max_http_version=max_http_version, protocol=protocol, minimum_chunk_size=minimum_chunk_size)
|
||||||
if server_event is not None:
|
if server_event is not None:
|
||||||
server_event.send(serv)
|
server_event.send(serv)
|
||||||
if max_size is None:
|
if max_size is None:
|
||||||
|
Reference in New Issue
Block a user