libhttpd.c文件是包含Thttpd服务器处理HTTP请求的相关函数是整个Thttpd的核心。下面将描述此文件中各个函数的作用。
static void check_options( void )
如果即定义了TILDE_MAP_1也定义了TILDE_MAP_2将在日志文件中输出相关信息,并退出程序。
static void free_httpd_server( httpd_server* hs )
此函数用户释放服务器创建时申请的各种资源。
httpd_server* httpd_initialize(
char* hostname, httpd_sockaddr* sa4P, httpd_sockaddr* sa6P,
unsigned short port, char* cgi_pattern, int cgi_limit, char* charset,
char* p3p, int max_age, char* cwd, int no_log, FILE* logfp,
int no_symlink_check, int vhost, int global_passwd, char* url_pattern,
char* local_pattern, int no_empty_referrers )
此函数用于根据传入的数据初始化服务器的相关参数。
static int initialize_listen_socket( httpd_sockaddr* saP )
此函数根据传入的IP地址和类型监听此IP地址的端口
void httpd_set_logfp( httpd_server* hs, FILE* logfp )
此函数用于设置http服务器的日志文件的文件描述符
void httpd_terminate( httpd_server* hs )
此函数用于关闭服务器,首先设置服务器不再监听,关闭服务器的日志文件,释放服务器创建时申请的各种资源。
void httpd_unlisten( httpd_server* hs )
此函数用于根据传入的IP地址类型和相关数据关闭http服务器的文件描述符
static void add_response( httpd_conn* hc, char* str )
此函数用于将数据添加至返回给用户数据的内存数组中。
void httpd_write_response( httpd_conn* hc )
此函数用于调用接口将数据写入返回至用户的文件描述符中。
void httpd_set_ndelay( int fd )
此函数用于设置此文件描述符为非阻塞模式。
void httpd_clear_ndelay( int fd )
此函数用户与设置此文件描述为阻塞模式
static void send_mime( httpd_conn* hc, int status, char* title, char* encodings, char* extraheads, char* type, off_t length, time_t mod )
此函数用于根据http连接对象hc的mime标志,时间mod生成返回给用户数据的响应行和响应首部,并添加至返回给用户的数据数组中。
void httpd_realloc_str( char** strP, size_t* maxsizeP, size_t size )
httpd_realloc_str函数接受3个参数strP字符串的二级指针,maxsizeP字符串的最大长度的指针,size当前需要的内存大小。根据maxsizeP的值和size的值重新给strP分配地址空间。
static void send_response( httpd_conn* hc, int status, char* title, char* extraheads, char* form, char* arg )
send_response函数根据服务器连接结构体hc,状态值status,状态字符title生成网页并发送给客户端,此函数主要用于错误时回复的网页。
static void send_response_tail( httpd_conn* hc )
send_response_tail主要是用于错误请求时发送服务器信息相关的内容
static void defang( char* str, char* dfstr, int dfsize )
defang函数主要是用于将str字符串中的大于号(>)和小于号(<)转换为>和<
void httpd_send_err( httpd_conn* hc, int status, char* title, char* extraheads, char* form, char* arg )
httpd_send_err函数主要是用于使用预订的错误网页,并将此网页发送给用户。对于订制的网页不存在则根据链接状态返回默认格式的错误信息。
static int send_err_file( httpd_conn* hc, int status, char* title, char* extraheads, char* filename )
send_err_file函数用于当用户有错误的请求的时候读取对应错误请求的文件(html文件),发送给用户。
static void send_authenticate( httpd_conn* hc, char* realm )
返回安全认证错误的网页信息
static int b64_decode( const char* str, unsigned char* space, int size )
b64_decode将base64编码转换为ASCII码。
static int auth_check( httpd_conn* hc, char* dirname )
auth_check函数返回用户认证的状态,负数表示认证失败
static int auth_check2( httpd_conn* hc, char* dirname )
auth_check2是进行认证的核心函数,对于认证失败的返回负数
static void send_dirredirect( httpd_conn* hc )
send_dirredirect函数用于处理文件路径错误的处理返回302错误
char* httpd_method_str( int method )
httpd_method_str函数将方法的代号转换为对应方法的字符串
static int hexit( char c )
hexit函数用于将16进制数转换为10进制数
static void strdecode( char* to, char* from )
strdecode函数用于将网络字符转串换为ASCII字符串
static void strencode( char* to, int tosize, char* from )
strencode函数用于将ASCII字符串转换为网络字符串
static int vhost_map( httpd_conn* hc )
vhost_map函数用于映射设备的虚拟主机名
static char* expand_symlinks( char* path, char** restP, int no_symlink_check, int tildemapped )
expand_symlinks用于根据no_symlink_check的值处理符号连接,如果no_symlink_check的值为将符号连接转换为绝对的路径
int httpd_get_conn( httpd_server* hs, int listen_fd, httpd_conn* hc )
httpd_get_conn函数用于处理用户的连接请求,对于接受的请求初始化相关的参数
int httpd_got_request( httpd_conn* hc )
httpd_got_request函数主要是分析请求的请求行并判断是否是有效的请求。
int httpd_parse_request( httpd_conn* hc )
httpd_parse_request函数用于分析请求首部并根据请求首部的相关字段初始化HTTP连接结构体的相关参数
static char* bufgets( httpd_conn* hc )
bufgets函数主要用于对获取的字符串进行将回车换行符转换为空字符,即获取一行数据
static void de_dotdot( char* file )
de_dotdot函数对文件的路径进行处理删除文件中的// ../ /../字符
void httpd_close_conn( httpd_conn* hc, struct timeval* nowP )
httpd_close_conn函数用于关闭传入的http连接结构体的连接
void httpd_destroy_conn( httpd_conn* hc )
httpd_destroy_conn函数为彻底的关闭此连接释放连接的资源
static int ext_compare( const void* v1, const void* v2 )
ext_compare函数用于判断两个mime实例字符串是否相等
static void init_mime( void )
init_mime函数用于根据字符顺序初始化mime表
static void figure_mime( httpd_conn* hc )
figure_mime函数用于根据http连接的请求的信息设置响应头中的mime字段
static void cgi_kill2( ClientData client_data, struct timeval* nowP )
cgi_kill2函数用于对于CGI过程超时的程序杀死此CGI进程。
static void cgi_kill( ClientData client_data, struct timeval* nowP )
cgi_kill函数用于定时杀死client_data中的进程标识的进程
static int name_compare( const void* v1, const void* v2 )
name_compare函数用于比较两个字符串是否相等
static int ls( httpd_conn* hc )
ls函数与linux中的ls命令一样,显示指定目录的文件信息
static char* build_env( char* fmt, char* arg )
build_env函数用于创建环境变量
static char** make_envp( httpd_conn* hc )
make_envp函数用于根据http连接状态的根据请求首部中提取的数据调用build_env创建环境变量
static char** make_argp( httpd_conn* hc )
make_argp函数用于根据请求的url生成CGI应用程序调用的参数数组
static void cgi_interpose_input( httpd_conn* hc, int wfd )
cgi_interpose_input函数用于处理POST请求将用户的数据存储在指定文件描述符中
static void post_post_garbage_hack( httpd_conn* hc )
post_post_garbage_hack函数用于在POST方法中在多读取两个字符也就是是读取数据完毕
static void cgi_interpose_output( httpd_conn* hc, int rfd )
cgi_interpose_output函数用于POST方法中将数据写入返回用户数据的描述符中
static void cgi_child( httpd_conn* hc )
cgi_child函数是处理CGI过程的主要函数,进行初始化环境变量和参数 根据方法的不同调用不同的过程。
static int cgi( httpd_conn* hc )
cgi函数主要是判断参数是否有效对于有效的参数创建子进程,并创建进程超时处理函数
static int really_start_request( httpd_conn* hc, struct timeval* nowP )
really_start_request函数是处理用户请求的主要函数,分析用户的url和用户的请求首部。
int httpd_start_request( httpd_conn* hc, struct timeval* nowP )
httpd_start_request是进行用户请求的处理函数调用really_start_request函数完成用户请求的处理
static void make_log_entry( httpd_conn* hc, struct timeval* nowP )
make_log_entry函数用于在日志文件中输出请求信息
static int check_referrer( httpd_conn* hc )
check_referrer函数用于检测请求的文件是否存在
static int really_check_referrer( httpd_conn* hc )
really_check_referrer函数用于检测请求的文件是否存在
char* httpd_ntoa( httpd_sockaddr* saP )
httpd_ntoa函数用于将数值的IP地址转换为字符串形式
static int sockaddr_check( httpd_sockaddr* saP )
sockaddr_check函数用于检测IP地址类型是否正确
static size_t sockaddr_len( httpd_sockaddr* saP )
sockaddr_len函数用于返回服务器的IP地址类型
static int my_snprintf( char* str, size_t size, const char* format, ... )
my_snprintf封装的字符串格式化输出函数
static long long atoll( const char* str )
atoll函数用于将字符串转换为长整型类型
int httpd_read_fully( int fd, void* buf, size_t nbytes )
httpd_read_fully函数用于在指定管道中读取数据
int httpd_write_fully( int fd, const char* buf, size_t nbytes )
httpd_write_fully函数用于向指定管道中写数据
void httpd_logstats( long secs )
httpd_logstats函数用于在日志文件中输出http服务器状态信息