根据前面系列的介绍httpd_got_request函数检验请求的格式是否正确,httpd_parse_request检验请求的内容是否正确,httpd_start_request函数的主要作用是根据请求的做出具体的回应,主要使用的是really_start_request函数。
really_start_request函数
really_start_request函数是具体的对用户的请求进行处理的函数,下面将讲述really_start_request函数的处理流程。
(1)首先获取用户请求文件的文件属性,获取文件属性失败返回500错误退出函数。
(2)如果文件不具有其他用户的可读或可操作属性,返回403错误退出函数。
(3)当请求的路径是文件夹。
1)判断hc->pathinfo的值不为空返回404错误退出函数,如果hc->origfilename的值不""或者"."或者hc->origfilename的最后一个字符不为'/'返回302退出函数
2)在此目录下寻找默认文件列表中获取文件信息成功的文件,如果找到跳转到got_one处执行,如果没有找到
1>如果文件不具有其他用户的可读权限返回403错误退出函数。
2>安全认证失败的退出函数
3>检测是否是经过其他网页引用过来的并进行处理,如果检测失败返回-1
4>调用ls函数返回此目录下的文件信息
5>再次进行符号扩展,校验转换后的结果是失败的返回500错误退出函数,对于转换成功的但是文件的属性还是没有可读或者可执行权限的返回403错误退出函数。
(4)检测引用的连接是否正确对于不正确的退出啊函数,正确的继续执行后面的过程。
(5)对于CGI的路径不为空且文件具有其他用户可执行权限且此文件处于CGI文件路径中执行CGI过程然后退出程序。
(6)如果文件具有其他用户的可执行权限返回403错误退出函数
(7)如果路径信息不为空返回403错误退出函数。
(8)如果请求方式不为GET或者是HEAD返回501错误退出函数
(9)如果用户请求定义范围设置,但是最大的范围超界设置发送的最后一个字节在文件的末尾。
(10)设置文件的mime类型
(11)如果请求为HEAD方式的处理返回200网页并退出,如果是GET且设置了If-Modified-Since标志且此文件修改时间不大于此时间返回304退出函数。
(12)对于是GET方式但是没有If-Modified-Since标志的请求从映射文件中获取,如果映射文件中没有返回500错误并退出,如果有此文件返回200并退出。
流程图
源程序
static int really_start_request( httpd_conn* hc, struct timeval* nowP ){ static char* indexname; static size_t maxindexname = 0; static const char* index_names[] = { INDEX_NAMES }; int i;#ifdef AUTH_FILE static char* dirname; static size_t maxdirname = 0;#endif /* AUTH_FILE */ size_t expnlen, indxlen; char* cp; char* pi; expnlen = strlen( hc->expnfilename ); /* Stat the file. */ /**获取文件的状态, * 并对于有错误的文件进行错误处理 * 对于正确的文件将文件的信息写入hc->sb中*/ if ( stat( hc->expnfilename, &hc->sb ) < 0 ) { httpd_send_err( hc, 500, err500title,