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。

posted @ 2016-01-04 16:03  廖飞  阅读(529)  评论(0编辑  收藏  举报