Ejemplo n.º 1
0
def http_connection(request, io_stream):
    '''Create an instance of the `tornado.http1connection.HTTP1Connection`.

    `io_stream` fixture will be used for the connection.
    '''
    opts = request.node.get_marker('http_connection_options')
    opts = opts.kwargs if opts else {}
    params = HTTP1ConnectionParameters(**opts)

    return HTTP1Connection(
        io_stream,
        is_client=True,
        params=params,
    )
Ejemplo n.º 2
0
 def _create_connection(self, stream: IOStream) -> HTTP1Connection:
     stream.set_nodelay(True)
     connection = HTTP1Connection(
         stream,
         True,
         HTTP1ConnectionParameters(
             no_keep_alive=True,
             max_header_size=self.max_header_size,
             max_body_size=self.max_body_size,
             decompress=bool(self.request.decompress_response),
         ),
         self._sockaddr,
     )
     return connection
Ejemplo n.º 3
0
 def initialize(
     self,
     request_callback: Union[
         httputil.HTTPServerConnectionDelegate,
         Callable[[httputil.HTTPServerRequest], None],
     ],
     no_keep_alive: bool = False,
     xheaders: bool = False,
     ssl_options: Union[Dict[str, Any], ssl.SSLContext] = None,
     protocol: str = None,
     decompress_request: bool = False,
     chunk_size: int = None,
     max_header_size: int = None,
     idle_connection_timeout: float = None,
     body_timeout: float = None,
     max_body_size: int = None,
     max_buffer_size: int = None,
     trusted_downstream: List[str] = None,
 ) -> None:
     # This method's signature is not extracted with autodoc
     # because we want its arguments to appear on the class
     # constructor. When changing this signature, also update the
     # copy in httpserver.rst.
     self.request_callback = request_callback
     self.xheaders = xheaders
     self.protocol = protocol
     self.conn_params = HTTP1ConnectionParameters(
         decompress=decompress_request,
         chunk_size=chunk_size,
         max_header_size=max_header_size,
         header_timeout=idle_connection_timeout or 3600,
         max_body_size=max_body_size,
         body_timeout=body_timeout,
         no_keep_alive=no_keep_alive,
     )
     TCPServer.__init__(
         self,
         ssl_options=ssl_options,
         max_buffer_size=max_buffer_size,
         read_chunk_size=chunk_size,
     )
     self._connections = set()  # type: Set[HTTP1ServerConnection]
     self.trusted_downstream = trusted_downstream
Ejemplo n.º 4
0
 def __init__(self, request_callback, no_keep_alive=False, io_loop=None,
              xheaders=False, ssl_options=None, protocol=None, gzip=False,
              chunk_size=None, max_header_size=None,
              idle_connection_timeout=None, body_timeout=None,
              max_body_size=None, max_buffer_size=None):
     self.request_callback = request_callback
     self.no_keep_alive = no_keep_alive
     self.xheaders = xheaders
     self.protocol = protocol
     self.conn_params = HTTP1ConnectionParameters(
         use_gzip=gzip,
         chunk_size=chunk_size,
         max_header_size=max_header_size,
         header_timeout=idle_connection_timeout or 3600,
         max_body_size=max_body_size,
         body_timeout=body_timeout)
     TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options,
                        max_buffer_size=max_buffer_size,
                        read_chunk_size=chunk_size)
     self._connections = set()
Ejemplo n.º 5
0
 def initialize(
     self,
     request_callback: Union[httputil.HTTPServerConnectionDelegate,
                             Callable[[httputil.HTTPServerRequest],
                                      None], ],
     no_keep_alive: bool = False,
     xheaders: bool = False,
     ssl_options: Union[Dict[str, Any], ssl.SSLContext] = None,
     protocol: str = None,
     decompress_request: bool = False,
     chunk_size: int = None,
     max_header_size: int = None,
     idle_connection_timeout: float = None,
     body_timeout: float = None,
     max_body_size: int = None,
     max_buffer_size: int = None,
     trusted_downstream: Container[str] = None,
 ) -> None:
     self.request_callback = request_callback
     self.xheaders = xheaders
     self.protocol = protocol
     self.conn_params = HTTP1ConnectionParameters(
         decompress=decompress_request,
         chunk_size=chunk_size,
         max_header_size=max_header_size,
         header_timeout=idle_connection_timeout or 3600,
         max_body_size=max_body_size,
         body_timeout=body_timeout,
         no_keep_alive=no_keep_alive,
     )
     TCPServer.__init__(
         self,
         ssl_options=ssl_options,
         max_buffer_size=max_buffer_size,
         read_chunk_size=chunk_size,
     )
     self._connections = set()  # type: Set[HTTP1ServerConnection]
     self.trusted_downstream = trusted_downstream
Ejemplo n.º 6
0
 def initialize(self, request_callback, no_keep_alive=False,
                xheaders=False, ssl_options=None, protocol=None,
                decompress_request=False,
                chunk_size=None, max_header_size=None,
                idle_connection_timeout=None, body_timeout=None,
                max_body_size=None, max_buffer_size=None,
                trusted_downstream=None):
     self.request_callback = request_callback
     self.xheaders = xheaders
     self.protocol = protocol
     self.conn_params = HTTP1ConnectionParameters(
         decompress=decompress_request,
         chunk_size=chunk_size,
         max_header_size=max_header_size,
         header_timeout=idle_connection_timeout or 3600,
         max_body_size=max_body_size,
         body_timeout=body_timeout,
         no_keep_alive=no_keep_alive)
     TCPServer.__init__(self, ssl_options=ssl_options,
                        max_buffer_size=max_buffer_size,
                        read_chunk_size=chunk_size)
     self._connections = set()
     self.trusted_downstream = trusted_downstream
Ejemplo n.º 7
0
 def _on_connect(self, stream):
     if self.final_callback is None:
         # final_callback is cleared if we've hit our timeout.
         stream.close()
         return
     self.stream = stream
     self.stream.set_close_callback(self._on_close)
     self._remove_timeout()
     if self.final_callback is None:
         return
     if self.request.request_timeout:
         self._timeout = self.io_loop.add_timeout(
             self.start_time + self.request.request_timeout,
             stack_context.wrap(self._on_timeout))
     if (self.request.method not in self._SUPPORTED_METHODS
             and not self.request.allow_nonstandard_methods):
         raise KeyError("unknown method %s" % self.request.method)
     for key in ('network_interface', 'proxy_host', 'proxy_port',
                 'proxy_username', 'proxy_password'):
         if getattr(self.request, key, None):
             raise NotImplementedError('%s not supported' % key)
     if "Connection" not in self.request.headers:
         self.request.headers["Connection"] = "close"
     if "Host" not in self.request.headers:
         if '@' in self.parsed.netloc:
             self.request.headers["Host"] = self.parsed.netloc.rpartition(
                 '@')[-1]
         else:
             self.request.headers["Host"] = self.parsed.netloc
     username, password = None, None
     if self.parsed.username is not None:
         username, password = self.parsed.username, self.parsed.password
     elif self.request.auth_username is not None:
         username = self.request.auth_username
         password = self.request.auth_password or ''
     if username is not None:
         if self.request.auth_mode not in (None, "basic"):
             raise ValueError("unsupported auth_mode %s",
                              self.request.auth_mode)
         auth = utf8(username) + b":" + utf8(password)
         self.request.headers["Authorization"] = (b"Basic " +
                                                  base64.b64encode(auth))
     if self.request.user_agent:
         self.request.headers["User-Agent"] = self.request.user_agent
     if not self.request.allow_nonstandard_methods:
         if self.request.method in ("POST", "PATCH", "PUT"):
             if (self.request.body is None
                     and self.request.body_producer is None):
                 raise AssertionError(
                     'Body must not be empty for "%s" request' %
                     self.request.method)
         else:
             if (self.request.body is not None
                     or self.request.body_producer is not None):
                 raise AssertionError(
                     'Body must be empty for "%s" request' %
                     self.request.method)
     if self.request.expect_100_continue:
         self.request.headers["Expect"] = "100-continue"
     if self.request.body is not None:
         # When body_producer is used the caller is responsible for
         # setting Content-Length (or else chunked encoding will be used).
         self.request.headers["Content-Length"] = str(len(
             self.request.body))
     if (self.request.method == "POST"
             and "Content-Type" not in self.request.headers):
         self.request.headers[
             "Content-Type"] = "application/x-www-form-urlencoded"
     if self.request.decompress_response:
         self.request.headers["Accept-Encoding"] = "gzip"
     req_path = ((self.parsed.path or '/') +
                 (('?' + self.parsed.query) if self.parsed.query else ''))
     self.stream.set_nodelay(True)
     self.connection = HTTP1Connection(
         self.stream, True,
         HTTP1ConnectionParameters(
             no_keep_alive=True,
             max_header_size=self.max_header_size,
             decompress=self.request.decompress_response), self._sockaddr)
     start_line = httputil.RequestStartLine(self.request.method, req_path,
                                            'HTTP/1.1')
     self.connection.write_headers(start_line, self.request.headers)
     if self.request.expect_100_continue:
         self._read_response()
     else:
         self._write_body(True)
Ejemplo n.º 8
0
    def send(self,
             request,
             stream=False,
             timeout=None,
             verify=True,
             cert=None,
             proxies=None):
        """Sends Request object. Returns Response object.

        :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
        :param stream: (optional) Whether to stream the request content.
        :param timeout: (optional) How long to wait for the server to send
            data before giving up, as a float, or a :ref:`(connect timeout,
            read timeout) <timeouts>` tuple.
        :type timeout: float or tuple
        :param verify: (optional) Whether to verify SSL certificates.
        :param cert: (optional) Any user-provided SSL certificate to be trusted.
        :param proxies: (optional) The proxies dictionary to apply to the request.
        :rtype: trip.adapters.MessageDelegate
        """
        if isinstance(timeout, tuple):
            try:
                connect_timeout, read_timeout = timeout
            except ValueError as e:
                # this may raise a string formatting error.
                err = ("Invalid timeout {0}. Pass a (connect, read) "
                       "timeout tuple, or a single float to set "
                       "both timeouts to the same value".format(timeout))
                raise ValueError(err)
        else:
            connect_timeout, read_timeout = timeout, timeout

        timeout_reason = {}
        if connect_timeout:
            timeout_reason['reason'] = 'while connecting'
            self.io_loop.add_timeout(
                self.io_loop.time() + connect_timeout,
                stack_context.wrap(
                    functools.partial(self._on_timeout, timeout_reason)))

        s = yield self.tcp_client.connect(request.host,
                                          request.port,
                                          af=request.af,
                                          ssl_options=self._get_ssl_options(
                                              request, verify, cert),
                                          max_buffer_size=self.max_buffer_size)

        if not timeout_reason or timeout_reason.get('reason'):
            s.set_nodelay(True)
            timeout_reason.clear()
        else:
            raise gen.Return(
                Timeout(timeout_reason.get('error', 'unknown'),
                        request=request))

        connection = HTTPConnection(
            s,
            HTTP1ConnectionParameters(no_keep_alive=True,
                                      max_header_size=self.max_header_size,
                                      max_body_size=self.max_body_size,
                                      decompress=request.decompress))

        if read_timeout:
            timeout_reason['reason'] = 'during request'
            self.io_loop.add_timeout(
                self.io_loop.time() + connect_timeout,
                stack_context.wrap(
                    functools.partial(self._on_timeout, timeout_reason)))

        connection.write_headers(request.start_line, request.headers)
        if request.body is not None:
            connection.write(request.body)  #TODO: partial sending
        connection.finish()

        future = Future()

        def handle_response(response):
            if isinstance(response, Exception):
                future.set_exception(response)
            else:
                future.set_result(response)

        resp = MessageDelegate(request, connection, handle_response, stream)

        headers_received = yield connection.read_headers(resp)

        if not stream and headers_received:
            yield connection.read_body(resp)

        if not timeout_reason or timeout_reason.get('reason'):
            timeout_reason.clear()
            resp = yield future
            raise gen.Return(resp)
        else:
            raise gen.Return(
                Timeout(timeout_reason.get('error', 'unknown'),
                        request=request))