apache request_rec连接请求结构体
2010年01月14日 星期四 下午 3:17
request_rec对象在Apache接受连接请求的时候创建,并在处理完请求之后马上销毁。为了处理连接请求(在第5章和第6章中讨论),request_rec对象被传递给所有模块的处理例程句柄。request_rec对象拥有所有涉及处理该HTTP请求的内部数据,也包括 Apache用来维护中间状态和客户端信息的一系列字段。
·管理在处理请求周期中的对象的请求池。用来管理在处理请求期间的资源分配。 ·静态请求配置(在httpd.conf或者.htaccess中指定的目录访问权限)的配置记录向量。 ·处理请求过程中用来管理临时数据的配置记录向量。 ·HTTP输入报头表,输出报头表和错误信息报头表。 ·Apache环境变量表(SSI、CGI、mod_rewrite、PHP脚本处理扩展中用到的环境变量),以及一个类似的记录请求数据的表,该表对脚本不可见。 ·指向其他相关对象的指针。包括connection、server和任何一个相关的请求对象。 ·指向输入输出过滤链(在第8章中讨论)。 ·URI请求及其中间解析形式,包括处理例程(见第5章)和文件系统映射(见第6章)。 这是摘自于httpd.h文件中对request_rec对象的完整定义: /** 表示当前请求的结构 */ struct request_rec { /** 和该请求相关联的池 */ apr_pool_t *pool; /** 到客户端的连接 */ conn_rec *connection; /** 处理本连接的虚拟主机 */ server_rec *server; /** 如果有外部重定向,指向请求重定向的指针 */ request_rec *next; /** 如果是内部重定向,指向前一个请求的指针 */ request_rec *prev; /**如果是一个子请求,指向主请求的指针 * (参见 http_request.h) */ request_rec *main; /* 请求自身的信息...我们从protocol.c能够涉及的项开始 */ /** 请求的第一行 */ char *the_request; /** HTTP/0.9,简单的请求 (例如,GET /foo\n w/no headers) */ int assbackwards; /** 一个代理请求 (在post_read_request/translate_name过程中计算) * 可能的值有:PROXYREQ_NONE、PROXYREQ_PROXY、PROXYREQ_REVERSE、 * PROXYREQ_RESPONSE */ int proxyreq; /** HEAD 请求,和GET相反 */ int header_only; /** 协议字符串,我们可以指定,或者为HTTP/0.9 */ char *protocol; /** 协议的版本号; 1.1 = 1001 */ int proto_num; /** 主机,使用URI 或者Host设定 */ const char *hostname; /** 请求开始的时间 */ apr_time_t request_time; /** 状态行,如果被脚本设定 */ const char *status_line; /** 状态行 */ int status; /* 请求的方法,双向的;在 protocol.c的外面, * 只参考,不要修改。 */ /** 请求的方法 (例如GET、HEAD、POST等) */ const char *method; /** M_GET、M_POST等*/ int method_number; /** * “allowed” 是一个允许方法的位向量。 * * 处理函数必须保证请求方法是可以被处理的。 * 任何模块应当拒绝它们不能处理的任何请求方法。 * 在终止处理函数之前,处理函数应当为每一个它愿意处理的请求方法设置r->allowed。 * 这个位向量用来确认"Allow" OPTIONS请求、HTTP_METHOD_NOT_ALLOWED、 * HTTP_NOT_IMPLEMENTED状态码。 * * 既然默认的处理函数处理OPTIONS,那么其他的模块一般拒绝处理OPTIONS。 * TRACE总是“Allowed”。模块不需要显式地设置它。 * * 既然默认的处理函数总是处理GET,那么 * 一个没有实现GET 的模块可以返回HTTP_METHOD_NOT_ALLOWED, * 不过这也意味着一个脚本GET处理函数不能被mod_actions安装。 */ apr_int64_t allowed; /** 扩展方法的数组*/ apr_array_header_t *allowed_xmethods; /** 允许方法的链表 */ ap_method_list_t *allowed_methods; /**body数据流的字节数 */ apr_off_t sent_bodyct; /** body的字节数 */ apr_off_t bytes_sent; /** 请求资源的最后修改时间 */ apr_time_t mtime; /* HTTP/1.1 连接层的性质 */ /** 发送块的传送代码 */ int chunked; /** Range: header */ const char *range; /** “真正”的内容长度 */ apr_off_t clength; /** 从请求主体中读取剩余的字节数 */ apr_off_t remaining; /** 从请求主体中已经读取的字节数 */ apr_off_t read_length; /** 读取请求主体的方法。 * (例如REQUEST_CHUNKED_ERROR、REQUEST_NO_BODY、 * REQUEST_CHUNKED_DECHUNK等)*/ int read_body; /** 读取块的传送代码 */ int read_chunked; /** 客户端等待100个回复? */ unsigned expecting_100; /* 输入和输出的MIME 报头环境,以及一个发送给子过程的、包含环境变量的数组。 * 所以人们可以编写模块增加到这个环境中。 * * headers_out和err_headers_out 的区别在于err_headers_out在发生错误时也被 * 显示。 * 并且在内部重定向时被保留 * (因此为ErrorDocument 处理函数所显示的header会有这些内容)。 * * 'notes' apr_table_t 被用来从一个模块向另一个模块记录,没有其他的意图。 */ /** 请求的MIME 报头环境 */ apr_table_t *headers_in; /** 应答的MIME 报头环境 */ apr_table_t *headers_out; /** 应答的MIME 报头环境,在出现错误时被显示,并且在内部重定向中被保留 */ apr_table_t *err_headers_out; /** 为子过程所使用的环境变量数组 */ apr_table_t *subprocess_env; /** 一个模块到另一个模块的记录 */ apr_table_t *notes; /* content_type、handler、content_encoding和所有的content_languages * 必须是小写字母的字符串。它们可以是指向静态字符串的指针, * 不能被修改。 */ /** 当前请求的 content-type */ const char *content_type; /** 用来调用一个处理函数的函数名称 */ const char *handler; /* 我们真正用来处理命令的函数 */ /** 如何编码数据 */ const char *content_encoding; /** 表示内容语言的字符串数组 */ apr_array_header_t *content_languages; /** 变长列表验证器(如果协商)*/ char *vlist_validator; /** 如果通过认证检查,用来设定用户名 */ char *user; /** 如果通过认证检查,用来设定认证类别 */ char *ap_auth_type; /** 表示不能被缓存 */ int no_cache; /** 没有此应答的本地拷贝 */ int no_local_copy; /* 需要什么样的对象(可以是直接的,也可是内容协商映射的)*/ /** 没有经过分解的URI */ char *unparsed_uri; /** URI的路径部分 */ char *uri; /** 和此应答对应的磁盘文件名 */ char *filename; /** 真正的文件名,如果不匹配我们填入r->filename */ char *canonical_filename; /** 此请求中抽取的PATH_INFO */ char *path_info; /** 此请求中抽取的QUERY_ARGS */ char *args; /** st_mode,如果没有此文件,该值设为0 */ apr_finfo_t finfo; /** 包含URI组件的结构体 */ apr_uri_t parsed_uri; /** * 处理函数接收或者拒绝当前请求的path_info的标志。 * 所有的模块应当尊重AP_REQ_ACCEPT_PATH_INFO和AP_REQ_REJECT_PATH_INFO * 的值,AP_REQ_DEFAULT_PATH_INFO表示遵从惯例。 * 这是对修订中在HOOK_VERY_FIRST 上根据用户的喜好设定的。 */ int used_path_info; /* 一些其他的配置信息可能根据.htaccess 文件进行变化。 * 这些是配置向量, 每一个模块都有一个void*指针。 */ /**配置文件中的可选设置 */ struct ap_conf_vector_t *per_dir_config; /** 对“这个”请求的记录 */ struct ap_conf_vector_t *request_config; /** * A linked list of the .htaccess configuration directives * accessed by this request. * N.B. always add to the head of the list, _never_ to the end. * that way, a sub request's list can (temporarily) point to a parent's list */ const struct htaccess_result *htaccess; /** A list of output filters to be used for this request */ struct ap_filter_t *output_filters; /** A list of input filters to be used for this request */ struct ap_filter_t *input_filters; /** A list of protocol level output filters to be used for this * request */ struct ap_filter_t *proto_output_filters; /** A list of protocol level input filters to be used for this * request */ struct ap_filter_t *proto_input_filters; /** A flag to determine if the eos bucket has been sent yet */ int eos_sent; /* Things placed at the end of the record to avoid breaking binary * compatibility. It would be nice to remember to reorder the entire * record to improve 64bit alignment the next time we need to break * binary compatibility for some other reason. */ } |