輕量web伺服器開發日記07-response結構體的實現
阿新 • • 發佈:2019-02-19
在日記06中介紹的request結構體是用於存放請求報文資訊的,而現在我要介紹的response結構體是用於存放伺服器分析request結構體裡的請求報文資訊後得出的響應報文。
(1)request結構體:
typedef struct {
//相對原始路徑(沒有引數)
bufstr *raw_url;
//響應報文的起始行
bufstr *response_line;
//響應報文的首部
bufstr *response_head;
//響應報文的主體部分
buffile *response_body;
//響應報文
bufstr *response_content;
}response;
(2)而在上面所說的伺服器分析request結構體裡的請求報文資訊後得出的響應報文操作:
int handle_request(mempool *mpool,connection *con,char *docroot)
{
//設定con連線的狀態為處理請求報文
con->con_stat = CON_STATE_HANDLE_REQUEST;
//請求報文符合GET方法和版本為HTTP/1.1才處理請求
if(bufstr_compare_string(con->rq->line_method,"GET")&&bufstr_compare_string(con-> rq->line_version,"HTTP/1.1"))
{
//解析請求報文的起始行url的原始路徑,並存入con連線的response結構體的raw_url中,
con->rp->raw_url = get_raw_url(mpool, con->rq->line_url);
printf("raw_url:\n%s\n",read_string_bufstr(con->rp->raw_url));
//按照請求url,尋找相應的資源
con->rp->response_body = buffile_create(mpool,docroot,con->rq->line_url);
//沒有找到相應的資源
if(con->rp->response_body->is_rewrite)
{
//構建響應報文的起始行
con->rp->response_line = bufstr_init(mpool);
bufstr_copy_string(mpool,con->rp->response_line,"HTTP/1.1 404 Not Found\r\n");
}
//找到相應的資源
else
{
//構建響應報文的起始行
con->rp->response_line = bufstr_init(mpool);
bufstr_copy_string(mpool,con->rp->response_line,"HTTP/1.1 200 OK\r\n");
}
//構建響應報文的首部
con->rp->response_head = bufstr_init(mpool);
bufstr *temp = bufstr_init(mpool);
bufstr_copy_string(mpool,temp,"Server: AntWeb\r\nContent-type: text/html\r\nContent-length: ");
bufstr_append_string(mpool,temp,itoa(con->rp->response_body->fused));
bufstr_append_string(mpool,temp,"\r\nConnection: close\r\n\r\n");
bufstr_copy_string_bufstr(mpool,con->rp->response_head,temp);
bufstr_free(mpool,temp);
//構建整個響應報文
con->rp->response_content = bufstr_init(mpool);
bufstr_append_bufstr(mpool,con->rp->response_content,con->rp->response_line);
bufstr_append_bufstr(mpool,con->rp->response_content,con->rp->response_head);
bufstr_append_buffile(mpool,con->rp->response_content,con->rp->response_body);
}
else
{
//設定con連線的狀態為請求處理錯誤
con->con_stat = CON_STATE_HANDLE_REQUEST;
//構建響應報文的起始行
con->rp->response_line = bufstr_init(mpool);
bufstr_copy_string(mpool,con->rp->response_line,"HTTP/1.1 400 Bad Request\r\n");
//構建響應報文的首部
con->rp->response_head = bufstr_init(mpool);
bufstr_copy_string(mpool,con->rp->response_head,"Server: AntWeb\r\nConnection: close\r\n\r\n");
//構建整個響應報文
con->rp->response_content = bufstr_init(mpool);
bufstr_append_bufstr(mpool,con->rp->response_content,con->rp->response_line);
bufstr_append_bufstr(mpool,con->rp->response_content,con->rp->response_head);
}
return 1;
}
在上面操作函式中connection結構體(日記08介紹)是用於存放某個請求連線全部的處理事務,包括該連線的套接字,連線狀態,請求報文,響應報文等等。