def feedChunks(handler): handler.next() while True: chunkSizeLine = yield readRe(REGEXP.CHUNK_SIZE_LINE, MAXREQUESTSIZE) size = int(chunkSizeLine['ChunkSize'], 16) if size == 0: yield handler.throw(StopIteration()) break yield copyBytes(size, handler) yield readRe(REGEXP.CRLF, 2) for partialResponse in handler: yield partialResponse
def testReadReEndOfStream(self): x = readRe(compile('.*'), 10) x.next() try: x.send(None) self.fail('must raise Exception') except Exception, e: self.assertEquals("no match at eof: ''", str(e))
def testReadRe(self): x = readRe(compile('(?P<ape>xyz)')) x.next() try: x.send('xyz') # fail self.fail('must not come here') except StopIteration, s: self.assertEquals(({'ape': 'xyz'},), s.args)
def testReadReWithMaximumBytes(self): x = readRe(compile('xyz'), 5) x.next() x.send('abc') try: x.send('abc') # fail self.fail('must not come here') except OverflowError, e: self.assertEquals('no match after 6 bytes', str(e))
def processConnection(self): while True: try: with HttpProtocol.Timer(REQUESTTIMEOUT): reqArgs = yield readRe(REGEXP.REQUEST, MAXREQUESTSIZE) except OverflowError: yield requestEntityTooLarge() yield HTTP.CRLF return except TimeoutException, e: yield requestTimeout() yield HTTP.CRLF return #except Exception: # yield badRequest() # yield HTTP.CRLF # return headers = parseHeaders(reqArgs) scheme, netloc, path, query, fragment = urlsplit(reqArgs['RequestURI']) netloc = tuple(netloc.split(':')) query = parse_qs(query) if 'content-length' in headers: length = int(headers['content-length'].keys()[0]) reqArgs['ContentLength'] = length chunked = 'transfer-encoding' in headers and headers['transfer-encoding'].keys()[0] == 'chunked' try: handler = self.any.processRequest( scheme=scheme, netloc=netloc, path=path, query=query, fragment=fragment, **reqArgs) except AttributeError: if 'expect' in headers: yield expectationFailed() else: yield notImplemented() else: if 'expect' in headers: yield hundredContinue() if chunked: handler = feedChunks(handler) yield handler if 'close' in headers['connection'] or reqArgs['HTTPVersion'] == '1.0': break