1. 程式人生 > >輕量web伺服器開發日記07-response結構體的實現

輕量web伺服器開發日記07-response結構體的實現

在日記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介紹)是用於存放某個請求連線全部的處理事務,包括該連線的套接字,連線狀態,請求報文,響應報文等等。