Esempio n. 1
0
 def test_request_uri_encodedurl(self):
     """
     A URL may be passed as a `hyperlink.EncodedURL` object. It is converted
     to bytes when passed to the underlying agent.
     """
     url = EncodedURL.from_text(u"https://example.org/foo")
     self.client.request("GET", url)
     self.agent.request.assert_called_once_with(
         b"GET", b"https://example.org/foo",
         Headers({b"accept-encoding": [b"gzip"]}),
         None,
     )
Esempio n. 2
0
def encoded_urls(draw):  # pragma: no cover
    # type: (DrawCallable) -> EncodedURL
    """
    A strategy which generates L{EncodedURL}s.
    Call the L{EncodedURL.to_uri} method on each URL to get an HTTP
    protocol-friendly URI.
    """
    port = cast(Optional[int], draw(port_numbers(allow_zero=True)))
    host = cast(Text, draw(hostnames()))
    path = cast(Sequence[Text], draw(paths()))

    if port == 0:
        port = None

    return EncodedURL(
        scheme=cast(Text, draw(sampled_from((u"http", u"https")))),
        host=host,
        port=port,
        path=path,
    )
Esempio n. 3
0
    def request(
        self,
        method,
        url,
        *,
        params=None,
        headers=None,
        data=None,
        files=None,
        json=_NOTHING,
        auth=None,
        cookies=None,
        allow_redirects=True,
        browser_like_redirects=False,
        unbuffered=False,
        reactor=None,
        timeout=None,
        _stacklevel=2,
    ):
        """
        See :func:`treq.request()`.
        """
        method = method.encode('ascii').upper()

        if isinstance(url, DecodedURL):
            parsed_url = url.encoded_url
        elif isinstance(url, EncodedURL):
            parsed_url = url
        elif isinstance(url, str):
            # We use hyperlink in lazy mode so that users can pass arbitrary
            # bytes in the path and querystring.
            parsed_url = EncodedURL.from_text(url)
        else:
            parsed_url = EncodedURL.from_text(url.decode('ascii'))

        # Join parameters provided in the URL
        # and the ones passed as argument.
        if params:
            parsed_url = parsed_url.replace(
                query=parsed_url.query + tuple(_coerced_query_params(params)))

        url = parsed_url.to_uri().to_text().encode('ascii')

        headers = self._request_headers(headers, _stacklevel + 1)

        bodyProducer, contentType = self._request_body(data,
                                                       files,
                                                       json,
                                                       stacklevel=_stacklevel +
                                                       1)
        if contentType is not None:
            headers.setRawHeaders(b'Content-Type', [contentType])

        if not isinstance(cookies, CookieJar):
            cookies = cookiejar_from_dict(cookies)

        cookies = merge_cookies(self._cookiejar, cookies)
        wrapped_agent = CookieAgent(self._agent, cookies)

        if allow_redirects:
            if browser_like_redirects:
                wrapped_agent = BrowserLikeRedirectAgent(wrapped_agent)
            else:
                wrapped_agent = RedirectAgent(wrapped_agent)

        wrapped_agent = ContentDecoderAgent(wrapped_agent,
                                            [(b'gzip', GzipDecoder)])

        if auth:
            wrapped_agent = add_auth(wrapped_agent, auth)

        d = wrapped_agent.request(method,
                                  url,
                                  headers=headers,
                                  bodyProducer=bodyProducer)

        if reactor is None:
            from twisted.internet import reactor
        if timeout:
            delayedCall = reactor.callLater(timeout, d.cancel)

            def gotResult(result):
                if delayedCall.active():
                    delayedCall.cancel()
                return result

            d.addBoth(gotResult)

        if not unbuffered:
            d.addCallback(_BufferedResponse)

        return d.addCallback(_Response, cookies)