[普通]apache request_rec连接请求结构体

作者(passion) 阅读(1544次) 评论(0) 分类( apache)

apache request_rec连接请求结构体

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.
*/
}


« 上一篇:wifi共享上网(至尊版wifi)
« 下一篇:ASP.NET附加数据库文件的方式,如何发布到IIS7而不导致SQLServer出错
在这里写下您精彩的评论
  • 微信

  • QQ

  • 支付宝

返回首页
返回首页 img
返回顶部~
返回顶部 img