Пример #1
0
 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)
Пример #2
0
    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:]))
Пример #4
0
 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 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]))
Пример #6
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])
Пример #7
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'))
Пример #8
0
    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)
Пример #9
0
    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)
Пример #10
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'))