apache request_rec连接请求结构体

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.
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值