def testLastRecvContainsCompleteChunk(self): reactor = CallTrace('Reactor') sokket = CallTrace('Sokket') data = [] done = [] class Handler: def send(self, chunk): data.append(chunk) def throw(self, exception): done.append(True) httpreader = HttpReader(reactor, sokket, Handler(), 'GET', 'host,nl', '/') httpreader._chunked = True chunkOne = '9\r\n123456789\r\n' chunkTwo = '8\r\n87654321\r\n' httpreader._sendFragment(chunkOne) self.assertEquals(['123456789'], data) httpreader._sendFragment(chunkTwo) self.assertEquals(['123456789', '87654321'], data) while data: del data[0] # now both in one network message httpreader._sendFragment(chunkOne + chunkTwo + '0\r\n\r\n') # Send fragment will only read one fragment. # Now feed it until all chunks are finished httpreader._sendFragment('') httpreader._sendFragment('') self.assertEquals(['123456789', '87654321'], data) self.assertEquals([True], done)
def testChunkedAllTheWay(self): reactor = CallTrace('Reactor') sokket = CallTrace('Sokket') data = [] class Handler: def send(self, chunk): data.append(chunk) def throw(self, exception): pass httpreader = HttpReader(reactor, sokket, Handler(), 'GET', 'host,nl', '/') httpreader._chunked = True # chunk == network message httpreader._sendFragment('4\r\n1234\r\n') self.assertEquals(['1234'], data) httpreader._sendFragment('10\r\n0123456789abcdef\r\n') self.assertEquals(['1234', '0123456789abcdef'], data) del data[0] del data[0] # chunk = 2 network messages httpreader._sendFragment('10\r\nfedcba') #self.assertEquals(['fedcba'], data) httpreader._sendFragment('9876543210\r\n') self.assertEquals(['fedcba9876543210'], data)
def testTimeoutOnServerGoingSilentAfterHeaders(self): port = randint(2**10, 2**16) reactor = Reactor() expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(port, "HTTP/1.1 200 OK\r\n\r\n", expectedrequest, delay=1) errorArgs = [] class Handler: def send(self, data): pass def throw(self, exception): errorArgs.append(exception) def error(exception): errorArgs.append(exception) reader = HttpReader(reactor, Connector(reactor, 'localhost', port), Handler(), "GET", "localhost", "/", timeout=0.01) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not errorArgs: reactor.step() serverThread.join() self.assertEquals('timeout while receiving data', str(errorArgs[0]))
def testDealWithChunkedResponse(self): with Reactor() as reactor: sentData = [] done = [] expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(self.port, "\r\n".join("""HTTP/1.1 302 Found Date: Fri, 26 Oct 2007 07:23:26 GMT Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 mod_ssl/2.2.3 OpenSSL/0.9.8c Location: /page/softwarestudio.page/show Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 4F <p>The document has moved <a href="/page/softwarestudio.page/show">here</a></p> 0 """.split("\n")), expectedrequest) class Handler: def send(self, data): sentData.append(data) def throw(self, exception): if isinstance(exception, StopIteration): done.append(True) reader = HttpReader(reactor, Connector(reactor, 'localhost', int(self.port)), Handler(), 'GET', 'localhost', '/', recvSize=5) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not done: reactor.step() self.assertEquals("""<p>The document has moved <a href="/page/softwarestudio.page/show">here</a></p>""", "".join(sentData[1:]))
def testTimeoutOnSilentServer(self): with Reactor() as reactor: expectedrequest = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/v%s\r\n\r\n" % WlVersion serverThread = server(self.port, "", expectedrequest) errorArgs = [] class Handler: def throw(self, exception): errorArgs.append(exception) def error(exception): errorArgs.append(exception) reader = HttpReader(reactor, Connector(reactor, 'localhost', self.port), Handler(), "GET", "localhost", "/", timeout=0.01) reactor.addTimer(0.2, lambda: self.fail("Test Stuck")) while not errorArgs: reactor.step() serverThread.join() self.assertEquals('timeout while receiving data', str(errorArgs[0]))
def testRequestAndHeaders(self): port = randint(2**10, 2**16) v = 'vx.y.z' expectedrequest = "GET /aap/noot/mies HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Weightless/%s\r\n\r\n" % v dataReceived = [] serverThread = server( port, "HTTP/1.1 200 OK\r\ncOnteNt-type: text/html\r\n\r\nHello World!", expectedrequest) class Generator(object): def __init__(self): self.throw = None self.next = None def send(self, data): dataReceived.append(data) reactor = Reactor() connection = Connector(reactor, 'localhost', port) reader = HttpReader(reactor, connection, Generator(), 'GET', 'localhost', '/aap/noot/mies', recvSize=7) reactor.addTimer(0.1, lambda: self.fail("Test Stuck")) while 'Hello World!' != "".join((x for x in dataReceived[1:] if x)): reactor.step() serverThread.join() self.assertEquals( { 'HTTPVersion': '1.1', 'StatusCode': '200', 'ReasonPhrase': 'OK', 'Headers': { 'Content-Type': 'text/html' }, 'Client': ('127.0.0.1', MATCHALL) }, dataReceived[0])
def testWriteChunks(self): reader = HttpReader(CallTrace("reactor"), CallTrace("socket"), HandlerFacade(None, None, None), '', '', '') self.assertEquals('1\r\nA\r\n', reader._createChunk('A')) self.assertEquals('A\r\n' + 10 * 'B' + '\r\n', reader._createChunk(10 * 'B'))