tornado 学习笔记15 _ServerRequestAdapter分析

     继承于HTTPMessageDeletegate,是HTTPMessageDeletegate的一种实现,用于处理请求消息。

15.1 构造函数

def __init__(self, server, server_conn, request_conn):
    self.server = server
    self.connection = request_conn
    self.request = None
    if isinstance(server.request_callback,
                  httputil.HTTPServerConnectionDelegate):
        self.delegate = server.request_callback.start_request(
            server_conn, request_conn)
        self._chunks = None
    else:
        self.delegate = None
        self._chunks = []

          判断HttpServer的request_callback属性的类型,如果是HTTPServerConnectionDelegate类型,设置委托代理属性,一旦设置了委托代理,以后请求消息的处理都由委托代理执行。其实在我们在应用Tornado开始应用程序时,初始化HttpServer时都会传递一个Application对象作为request_callback属性的值,而这个对象就是HTTPServerConnectionDelegate类型,因此,请求消息的处理可以参考Application对象的start_request方法返回的_RequestDispatcheer类。

15.2 headers_received

       在HTTP头部被接收以及被解析后调用。

def headers_received(self, start_line, headers):
    if self.server.xheaders:
        self.connection.context._apply_xheaders(headers)
    if self.delegate is None:
        self.request = httputil.HTTPServerRequest(
            connection=self.connection, start_line=start_line,
            headers=headers)
    else:
        return self.delegate.headers_received(start_line, headers)

参数:

         start_line:代表开始行,如果是客户端消息,则是RequestStartLine,如果是服务端消息,则是ResponseStartLine.

         headers:HTTPHeaders实例。表示消息头数据。

15.3 data_received

      当数据块被接收后调用。

def data_received(self, chunk):
    if self.delegate is None:
        self._chunks.append(chunk)
    else:
        return self.delegate.data_received(chunk)

参数:

        chunk: 接收到的数据块。

15.4 finish

       当最后一个数据块被接收后调用。

def finish(self):
    if self.delegate is None:
        self.request.body = b''.join(self._chunks)
        self.request._parse_body()
        self.server.request_callback(self.request)
    else:
        self.delegate.finish()
    self._cleanup()

       就是做一些清理工作。

15.5 on_connection_close

      当连接关闭后被调用。

def on_connection_close(self):
    if self.delegate is None:
        self._chunks = None
    else:
        self.delegate.on_connection_close()
    self._cleanup()
posted @ 2016-01-04 16:16  廖飞  阅读(404)  评论(0编辑  收藏  举报