在解析完客户端的请求报文之后,接下来就是根据解析的结果生成响应报文并发送一个应答。
一、找到请求的资源文件
根据解析请求报文得到的url 判断请求的资源文件是否存在并且用户是否具有可读的权限。
若文件存在且可读,则调用mmap()将资源文件映射到内存中,m_file_address保存文件在内存中的地址。
二、生成响应报文的状态行和头部信息
生成响应报文的状态行和头部信息 可以通过具有一个可变参数的函数来完成。
bool add_response(const char* format,...)
{
if(m_write_idx >=WRITE_BUFFER_SIZE )
return false;
va_list arg_list;//可变形参指针
va_start(arglist,format);//arglist 指向第一个可变形参列表
//将可变形参以format的格式写入m_write_buf
int len = vsnprintf(m_write_buf+m_write_idx,WRITE_BUFFER-1-m_write_idx,format,arglist);
if(len >=WRITE_BUFFER_SIZE -1-m_wirte_idx)
{
va_end(arglist);
return false;
}
m_write_idx +=len;
//清空可变形参列表
va_end(arglist);
return true;
}
然后在添加状态行、头部的函数内部调用add_response()
添加状态行的函数
void add_status_line(int status,const char* title)
{
return add_reponse("%s %d %s\r\n","HTTP/1.1",status,title);
}
类似的还有添加头部、添加内容等函数。
void add_headers(int length