def testBuffer(self): b = StringIOWithoutClosing() a = http.HTTPChannel() a.requestFactory = DummyHTTPHandler a.makeConnection(protocol.FileWrapper(b)) # one byte at a time, to stress it. for byte in self.requests: a.dataReceived(byte) a.connectionLost(IOError("all one")) value = b.getvalue() if value != self.expected_response: for i in range(len(value)): if len(self.expected_response) <= i: print ` value[i - 5:i + 10] `, ` self.expected_response[i - 5:i + 10] ` elif value[i] != self.expected_response[i]: print ` value[i - 5:i + 10] `, ` self.expected_response[i - 5:i + 10] ` break print '---VALUE---' print repr(value) print '---EXPECTED---' print repr(self.expected_response) raise AssertionError
def testAlgorithm(self): c = http.HTTPChannel() for req, version, correctResult, resultHeaders in self.ptests: result = c.checkPersistence(req, version) self.assertEquals(result, correctResult) for header in resultHeaders.keys(): self.assertEquals(req.responseHeaders.getRawHeaders(header, None), resultHeaders[header])
def _create_post_request(self, path, data): request = http.Request(http.HTTPChannel(), True) request.method = "post" request.path = path request.args = {} request.gotLength(1000) request.requestHeaders = Headers( {"Content-Type": ['application/json']}) request.handleContentChunk(json.dumps(data)) return request
def testLoopback(self): server = http.HTTPChannel() server.requestFactory = DummyHTTPHandler client = LoopbackHTTPClient() client.handleResponse = self._handleResponse client.handleHeader = self._handleHeader client.handleEndHeaders = self._handleEndHeaders client.handleStatus = self._handleStatus d = loopback.loopbackAsync(server, client) d.addCallback(self._cbTestLoopback) return d
def test_buffer(self): """ Send requests over a channel and check responses match what is expected. """ b = StringTransport() a = http.HTTPChannel() a.requestFactory = DummyHTTPHandler a.makeConnection(b) # one byte at a time, to stress it. for byte in self.requests: a.dataReceived(byte) a.connectionLost(IOError("all one")) value = b.value() self.assertResponseEquals(value, self.expected_response)
def test_buffer(self): """ Send requests over a channel and check responses match what is expected. """ b = StringIOWithoutClosing() a = http.HTTPChannel() a.requestFactory = DummyHTTPHandler a.makeConnection(protocol.FileWrapper(b)) # one byte at a time, to stress it. for byte in self.requests: a.dataReceived(byte) a.connectionLost(IOError("all one")) value = b.getvalue() self.assertEquals(value, self.expected_response)
def runRequest(self, httpRequest, requestClass, success=1): httpRequest = httpRequest.replace("\n", "\r\n") b = StringIOWithoutClosing() a = http.HTTPChannel() a.requestFactory = requestClass a.makeConnection(protocol.FileWrapper(b)) # one byte at a time, to stress it. for byte in httpRequest: if a.transport.closed: break a.dataReceived(byte) a.connectionLost(IOError("all done")) if success: self.assertEquals(self.didRequest, 1) del self.didRequest else: self.assert_(not hasattr(self, "didRequest"))
def testLoopback(self): server = http.HTTPChannel() server.requestFactory = DummyHTTPHandler client = LoopbackHTTPClient() client.handleResponse = self._handleResponse client.handleHeader = self._handleHeader client.handleEndHeaders = self._handleEndHeaders client.handleStatus = self._handleStatus loopback.loopback(server, client) if not (self.gotStatus and self.gotResponse and self.gotEndHeaders): raise RuntimeError, "didn't got all callbacks %s" % [ self.gotStatus, self.gotResponse, self.gotEndHeaders ] del self.gotEndHeaders del self.gotResponse del self.gotStatus del self.numHeaders
def test_requestBodyTimeout(self): """ L{HTTPChannel} resets its timeout whenever data from a request body is delivered to it. """ clock = Clock() transport = StringTransport() protocol = http.HTTPChannel() protocol.timeOut = 100 protocol.callLater = clock.callLater protocol.makeConnection(transport) protocol.dataReceived('POST / HTTP/1.0\r\nContent-Length: 2\r\n\r\n') clock.advance(99) self.assertFalse(transport.disconnecting) protocol.dataReceived('x') clock.advance(99) self.assertFalse(transport.disconnecting) protocol.dataReceived('x') self.assertEqual(len(protocol.requests), 1)
def _create_get_request(self, path, args): request = http.Request(http.HTTPChannel(), True) request.method = "get" request.path = path request.args = args return request
def test_multipartFormatCorrection(self): requestBody = BytesIO() class TestRequest(DreamuploaderRequest): def process(self): requestBody.write(self.content.read()) self.write(b"done") self.finish() channel = http.HTTPChannel() channel.requestFactory = TestRequest transport = StringTransport() channel.makeConnection(transport) channel.dataReceived(b'''\ POST /upload HTTP/1.0 User-Agent: Mozilla/3.0 (DreamPassport/3.15) Content-Type: multipart/form-data; boundary=-----------------------------3943144700513 Content-Length: 6714 -----------------------------3943144700513 Content-Disposition: form-data; name="upfile" filename=C_TAXI02.R00&fs=4608&bl=9&tp=0&fl=16&of=0&tm=200508210125370 SVS+ENT4QdFb7eA5EOA5EYceSyJDENzZXYM56aA5IMyS9YNDEYzZyYY5EOA5EOA5YY2LdSS5YZ5YyaWy yAAAAAYAASAAAccUeRvAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/vAHSLRK////RL0AAAAAAAAAAAAAAAA AAAAAAAAAAAZAAAAAAAAAAAAASAAAAAAAzAAAAAAASAAASAAASAAASASAAAAAzAAAZYAAZAAAAYAAAAA AAASAAASAAYAAAYAAZAAASAAYAAZAAAZAAAzAAASAAYAAAYZAAAAAZAZYAAAASAZYAAOEaEaAAASASAA AAYAAzAeE+Ea6+EZAZYAAAAzAAASEkEaEa6kESAZYAAAYSAAYt6aEaEt6kEAAzAZAzYAAO6+EaEaEk6+ AAYSASYzYAEtEaEk6+Et6bAzYAYZYzYt6+Ek6kEaEtEzYzAZAZYeEaEt6k6+EaEbYzYAASAZEazO6k6k EaEaEzYSAAAAAeTYEt6k6aEaE5YzYAAAAZEaEa6k6+EaEaAZYzYAAAYeTOEt6kEaEaE5YzYzYAYzEaEa Et6aEaEaYzYzYzYzYe6MTOEaEaEaEzYzYzYzYzEkEaEaEaEaEzzYzYzYzOYe6+EaEaEaEbNYzOEMzYEb YtEaEaE+YzYIzYEazYSaEzEaEaEt6+YzzYSaTYzOEbYeEaEa6k6bNYzYzYzYEaYzYaEaEk6+YIzYEMzO EaEzYzEaEt6k6bzYSaTYSaEbYzYeEa6k6+NYzOEMzYEbYzYzYe6k6+EIzYEazYSaEzYzYzyeEaTyIaEa EeEaEbYzYzYyyyyyyyYaEbYeEaYzYzYzYzYzYzYzYzYzYzYzYzYzYyTNIO2R69IGSYZASYZASYZASYZA zY6uPeVmIOVL6LM26IEVzIcL6IcASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASLER6LIRiLEF6LY+c96wP9AR6LAR6LAR6LAR6LAR6LA+6LZImMYjXOJTmtEjIMZASYZA SYZASO2R6LAR6LAR6LAR6LAR6LAR6tARSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAEOA5EOZLSyE5P+ZTS2ycSIGASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAEOARTk60Et6GSYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAcO2+EYceSyJDENT3SIzASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAS2NeSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAeIcN9INiSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZA6LYu6LAR6LAR6LIRiLEF6LY+cIZASYZASYZASYZASYZASYZA SYZAATC6AAZLQrNo7yzb7dM+PIbJqdVbg0y+PIzLP9ER6LY5EOA5EA5AAAAZAAAAAAAAAAAAAAO5O5AA pRAAALQiAAAAAAAAAAAAAAAAAAAAAAAAAIkxyNSqy4EcIrNe54yeKyPIIs4eH4SbBMUY94Ji/zSiLBGi vYogB4yevNPyI84OgRVySaFaSba/Q5V+Yyy+EBEUQMu+Byy+aBm7Q8c+U4YZQxJH9sGia5YZAtNiOyGi AyGyBE4Q44+4BPzyBPWQFVk6B6GyB6uQsV+CBmNyBTbQM4+cBE4yBEDQbN+LBETzZN+ZB4FHBnuyBnyQ f4FpBdZyBNuQyVFIBNTyBNcQyVFqBdzyBduQQyFVBnbyBnJQlNFWBnGz6NF/B4F/BnVyBnJQqVFkBnZy BdGQfNF8BdJyBduQfNFRBnzyBnqQ74FvBnVNeVFHBnW7BnvyZyFHBnVQlNF1SSEZBnFQ7VFvBnVNONFH BnW7BnGyBnFQ74FwBnyNAVFkBnTQQyF+yyFkBnzQqVFoyyFvBnVQl4F/yAT7BnWQl4FvzSNQ7VFoBn4Q 74yQlNFWBnGQlVSNB4F/BnFQ7NyQQVFuBdbQDYIZBdNQBVF7BdNyBd4QfVF2BnqyBnJQlNFWBnGznNF/ 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 -----------------------------3943144700513 Content-Disposition: form-data; name="name" CTAXI2R0 -----------------------------3943144700513 Content-Disposition: form-data; name="submit" Upload -----------------------------3943144700513-- '''.replace(b"\n", b"\r\n")) channel.connectionLost(IOError("all done")) self.assertEqual( requestBody.getvalue().replace(b"\r\n", b"\n"), b'''\ -------------------------------3943144700513 Content-Disposition: form-data; name="upfile" filename=C_TAXI02.R00&fs=4608&bl=9&tp=0&fl=16&of=0&tm=200508210125370 SVS+ENT4QdFb7eA5EOA5EYceSyJDENzZXYM56aA5IMyS9YNDEYzZyYY5EOA5EOA5YY2LdSS5YZ5YyaWy yAAAAAYAASAAAccUeRvAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/vAHSLRK////RL0AAAAAAAAAAAAAAAA AAAAAAAAAAAZAAAAAAAAAAAAASAAAAAAAzAAAAAAASAAASAAASAAASASAAAAAzAAAZYAAZAAAAYAAAAA AAASAAASAAYAAAYAAZAAASAAYAAZAAAZAAAzAAASAAYAAAYZAAAAAZAZYAAAASAZYAAOEaEaAAASASAA AAYAAzAeE+Ea6+EZAZYAAAAzAAASEkEaEa6kESAZYAAAYSAAYt6aEaEt6kEAAzAZAzYAAO6+EaEaEk6+ AAYSASYzYAEtEaEk6+Et6bAzYAYZYzYt6+Ek6kEaEtEzYzAZAZYeEaEt6k6+EaEbYzYAASAZEazO6k6k EaEaEzYSAAAAAeTYEt6k6aEaE5YzYAAAAZEaEa6k6+EaEaAZYzYAAAYeTOEt6kEaEaE5YzYzYAYzEaEa Et6aEaEaYzYzYzYzYe6MTOEaEaEaEzYzYzYzYzEkEaEaEaEaEzzYzYzYzOYe6+EaEaEaEbNYzOEMzYEb YtEaEaE+YzYIzYEazYSaEzEaEaEt6+YzzYSaTYzOEbYeEaEa6k6bNYzYzYzYEaYzYaEaEk6+YIzYEMzO EaEzYzEaEt6k6bzYSaTYSaEbYzYeEa6k6+NYzOEMzYEbYzYzYe6k6+EIzYEazYSaEzYzYzyeEaTyIaEa EeEaEbYzYzYyyyyyyyYaEbYeEaYzYzYzYzYzYzYzYzYzYzYzYzYzYyTNIO2R69IGSYZASYZASYZASYZA zY6uPeVmIOVL6LM26IEVzIcL6IcASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASLER6LIRiLEF6LY+c96wP9AR6LAR6LAR6LAR6LAR6LA+6LZImMYjXOJTmtEjIMZASYZA SYZASO2R6LAR6LAR6LAR6LAR6LAR6tARSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAEOA5EOZLSyE5P+ZTS2ycSIGASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAEOARTk60Et6GSYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAcO2+EYceSyJDENT3SIzASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAS2NeSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZAeIcN9INiSYZASYZASYZASYZASYZASYZASYZASYZASYZASYZA SYZASYZASYZASYZASYZASYZASYZASYZA6LYu6LAR6LAR6LIRiLEF6LY+cIZASYZASYZASYZASYZASYZA SYZAATC6AAZLQrNo7yzb7dM+PIbJqdVbg0y+PIzLP9ER6LY5EOA5EA5AAAAZAAAAAAAAAAAAAAO5O5AA pRAAALQiAAAAAAAAAAAAAAAAAAAAAAAAAIkxyNSqy4EcIrNe54yeKyPIIs4eH4SbBMUY94Ji/zSiLBGi vYogB4yevNPyI84OgRVySaFaSba/Q5V+Yyy+EBEUQMu+Byy+aBm7Q8c+U4YZQxJH9sGia5YZAtNiOyGi AyGyBE4Q44+4BPzyBPWQFVk6B6GyB6uQsV+CBmNyBTbQM4+cBE4yBEDQbN+LBETzZN+ZB4FHBnuyBnyQ f4FpBdZyBNuQyVFIBNTyBNcQyVFqBdzyBduQQyFVBnbyBnJQlNFWBnGz6NF/B4F/BnVyBnJQqVFkBnZy BdGQfNF8BdJyBduQfNFRBnzyBnqQ74FvBnVNeVFHBnW7BnvyZyFHBnVQlNF1SSEZBnFQ7VFvBnVNONFH BnW7BnGyBnFQ74FwBnyNAVFkBnTQQyF+yyFkBnzQqVFoyyFvBnVQl4F/yAT7BnWQl4FvzSNQ7VFoBn4Q 74yQlNFWBnGQlVSNB4F/BnFQ7NyQQVFuBdbQDYIZBdNQBVF7BdNyBd4QfVF2BnqyBnJQlNFWBnGznNF/ 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 -------------------------------3943144700513 Content-Disposition: form-data; name="name" CTAXI2R0 -------------------------------3943144700513 Content-Disposition: form-data; name="submit" Upload -------------------------------3943144700513-- ''')
def txrequest(): tcp_channel = DummyChannel.TCP() http_channel = http.HTTPChannel() http_channel.makeConnection(tcp_channel) return Request(http_channel)
def make_dummy_http_request(self): """Make a dummy HTTP request for tests.""" transport = FileWrapper(io.BytesIO()) channel = http.HTTPChannel() channel.makeConnection(transport) return http.Request(channel, True)