Example #1
0
 def test_renderRealRequest(self):
     """
     The request managed by L{WebSocketsResource.render} doesn't contain
     unnecessary HTTP headers like I{Content-Type} or I{Transfer-Encoding}.
     """
     channel = DummyChannel()
     channel.transport = StringTransportWithDisconnection()
     channel.transport.protocol = channel
     request = Request(channel, False)
     headers = {
         "upgrade": "Websocket",
         "connection": "Upgrade",
         "sec-websocket-key": "secure",
         "sec-websocket-version": "13"}
     for key, value in headers.items():
         request.requestHeaders.setRawHeaders(key, [value])
     request.method = "GET"
     request.clientproto = "HTTP/1.1"
     result = self.resource.render(request)
     self.assertEqual(NOT_DONE_YET, result)
     self.assertEqual(
         [("Connection", ["Upgrade"]),
          ("Upgrade", ["WebSocket"]),
          ("Sec-Websocket-Accept", ["oYBv54i42V5dw6KnZqOFroecUTc="])],
         list(request.responseHeaders.getAllRawHeaders()))
     self.assertEqual(
         "HTTP/1.1 101 Switching Protocols\r\n"
         "Connection: Upgrade\r\n"
         "Upgrade: WebSocket\r\n"
         "Sec-Websocket-Accept: oYBv54i42V5dw6KnZqOFroecUTc=\r\n\r\n",
         channel.transport.value())
     self.assertEqual(101, request.code)
     self.assertIdentical(None, request.transport)
Example #2
0
 def renderRequest(self, headers=None, url="/test", ssl=False,
                   queued=False, body=None):
     """
     Render a request against C{self.site}, writing the WebSocket
     handshake.
     """
     if headers is None:
         headers = [
             ("Upgrade", "WebSocket"), ("Connection", "Upgrade"),
             ("Host", "localhost"), ("Origin", "http://localhost/")]
     channel = DummyChannel()
     if ssl:
         channel.transport = channel.SSL()
     channel.site = self.site
     request = self.site.requestFactory(channel, queued)
     for k, v in headers:
         request.requestHeaders.addRawHeader(k, v)
     request.gotLength(0)
     request.requestReceived("GET", url, "HTTP/1.1")
     if body:
         request.channel._transferDecoder.finishCallback(body)
     return channel
Example #3
0
 def channelFactory():
     channel = DummyChannel()
     channel.transport = DummyChannel.SSL()
     return channel
Example #4
0
 def makeChannel():
     channel = DummyChannel()
     channel.transport = DummyChannel.TCP()
     channel.transport.port = portNumber
     return channel
Example #5
0
def requestMock(
    path: bytes,
    method: bytes = b"GET",
    host: bytes = b"localhost",
    port: int = 8080,
    isSecure: bool = False,
    body: bytes = b"",
    headers: Optional[Mapping[bytes, Sequence[bytes]]] = None,
) -> IRequest:
    if not headers:
        headers = {}

    if not body:
        body = b""

    path, qpath = (path.split(b"?", 1) + [b""])[:2]

    request = server.Request(DummyChannel(), False)
    request.site = Mock(server.Site)
    request.gotLength(len(body))
    request.content = BytesIO()
    request.content.write(body)
    request.content.seek(0)
    request.args = parse_qs(qpath)
    request.requestHeaders = Headers(headers)
    request.setHost(host, port, isSecure)
    request.uri = path
    request.prepath = []
    request.postpath = path.split(b"/")[1:]
    request.method = method
    request.clientproto = b"HTTP/1.1"

    request.setHeader = Mock(wraps=request.setHeader)
    request.setResponseCode = Mock(wraps=request.setResponseCode)

    request._written = BytesIO()
    request.finishCount = 0
    request.writeCount = 0

    def registerProducer(producer, streaming):
        request.producer = producer
        for _ in range(2):
            if request.producer:
                request.producer.resumeProducing()

    def unregisterProducer():
        request.producer = None

    def finish():
        request.finishCount += 1

        if not request.startedWriting:
            request.write(b"")

        if not request.finished:
            request.finished = True
            request._cleanup()

    def write(data):
        request.writeCount += 1
        request.startedWriting = True

        if not request.finished:
            request._written.write(data)
        else:
            raise RuntimeError("Request.write called on a request after "
                               "Request.finish was called.")

    def getWrittenData():
        return request._written.getvalue()

    request.finish = finish
    request.write = write
    request.getWrittenData = getWrittenData

    request.registerProducer = registerProducer
    request.unregisterProducer = unregisterProducer

    request.processingFailed = Mock(wraps=request.processingFailed)

    return request
Example #6
0
def mock_get_request(path, method=b"GET"):
    request = server.Request(DummyChannel(), False)
    request.uri = path
    request.method = method
    request.clientproto = b'HTTP/1.1'
    return request