def __init__(self, sock, autoCommit=False, bufferSize=8192): """Create stream. We get an extra `sock` argument, which is the socket which we'll stream output to (if we're streaming). """ ASStreamOut.__init__(self, autoCommit, bufferSize) self._socket = sock
def doTransaction(self, env, input): """Process transaction.""" requestDict = dict(format='CGI', environ=env, input=input) self.startRequest(requestDict) streamOut = ASStreamOut() self.dispatchRawRequest(requestDict, streamOut) try: self.processResponse(streamOut._buffer) self._sock.shutdown(2) except socket.error as e: if e[0] == errno.EPIPE: # broken pipe return print '%5d HTTPServer output error: %s' % (self._requestID, e) self.endRequest()
def flush(self): """Flush stream. Calls `ASStreamOut.ASStreamOut.flush`, and if that returns True (indicating the buffer is full enough) then we send data from the buffer out on the socket. """ result = ASStreamOut.flush(self) if result: # a true return value means we can send reslen = len(self._buffer) sent = 0 bufferSize = self._bufferSize while sent < reslen: try: sent += self._socket.send( self._buffer[sent:sent+bufferSize]) except socket.error as e: if debug or e[0] not in self._ignoreErrnos: print "StreamOut Error:", e self._closed = True raise ConnectionAbortedError self.pop(sent)