zoukankan      html  css  js  c++  java
  • tornado学习笔记14 HTTP1ServerConnection分析

            代表HTTP/1.x 类型的服务器连接,负责处理HTTP/1.x类型的请求。

    14.1 构造函数

    def __init__(self, stream, params=None, context=None):
        """
        :arg stream: an `.IOStream`
        :arg params: a `.HTTP1ConnectionParameters` or None
        :arg context: an opaque application-defined object that is accessible
            as ``connection.context``
        """
        self.stream = stream
        if params is None:
            params = HTTP1ConnectionParameters()
        self.params = params
        self.context = context
        self._serving_future = None

    参数:

                stream:流对象,要么是IOStream类型,要么是SSLIOStream类型.

                params:连接参数对象,HTTP1ConnectionParameters类型(设置no_keep_alive、chunk_size、max_header_size、max_body_size、body_timeout、decompress等属性)。

                context:请求的上下文对象。

    14.2 开始服务 start_serving

         开始处理这个连接上的请求。

    def start_serving(self, delegate):
        """Starts serving requests on this connection.
    
        :arg delegate: a `.HTTPServerConnectionDelegate`
        """
        assert isinstance(delegate, httputil.HTTPServerConnectionDelegate)
        self._serving_future = self._server_request_loop(delegate)
        # Register the future on the IOLoop so its errors get logged.
        self.stream.io_loop.add_future(self._serving_future,
                                       lambda f: f.result())

             参数delegate为HTPPServerConnectionDelegate对象,根据HttpServer中的handle_stream方法实现中可以看出,这个对象就是HttpServer对象。

            从代码实现上来看,这个过程最终由_server_request_loop函数来实现。

    14.3 _server_request_loop

           请求流(stream)处理循环。这个方法很关键,是处理请求的核心实现。

    def _server_request_loop(self, delegate):
        try:
            while True:
                conn = HTTP1Connection(self.stream, False,
                                       self.params, self.context)
                request_delegate = delegate.start_request(self, conn)
                try:
                    ret = yield conn.read_response(request_delegate)
                except (iostream.StreamClosedError,
                        iostream.UnsatisfiableReadError):
                    return
                except _QuietException:
                    # This exception was already logged.
                    conn.close()
                    return
                except Exception:
                    gen_log.error("Uncaught exception", exc_info=True)
                    conn.close()
                    return
                if not ret:
                    return
                yield gen.moment
        finally:
            delegate.on_close(self)

             参数如同start_serving方法。

              从代码上可知,真正的实现由_ServerRequestAdapter以及HTTP1Connection对象conn两个对象进行。HTTP1Connection负责请求数据(headers、body)的读取,然后ServerRequestAdapter负责读取后数据的处理,比如它有两个方法header_received以及data_received。

  • 相关阅读:
    SSH
    Maven仓库
    java中的代理
    R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
    R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
    软件的版本命名管理
    软件的版本命名管理
    递归缩写
    递归缩写
    开源软件的许可(License)
  • 原文地址:https://www.cnblogs.com/liaofeifight/p/5099220.html
Copyright © 2011-2022 走看看