目录
构建响应
我们上次说完了处理请求与构建相应,而现在我们要做的就是完成对于不需要启动CGI的请求,在确认路径有效的情况下,我们要对其返回静态的网页,当然,这里的返回网页不仅仅是返回我们的网页内容,这里我们需要加上响应行,相应报头的等等信息。
可以看到的是响应报文的结构,其中包括的是状态行,响应报头,空行,和响应正文等,这个时候我们构建响应类,把这些添加入我们的响应类中。
class HttpResponse{
public:
std::string status_line;
std::vector<std::string> response_header;
std::string blank;
std::string response_body;
}
构建响应状态行
由上图可知,状态行包括的是 版本号,状态码 和状态码描述。
版本号和状态码的构建
#define HTTP_VERSION "HTTP/1.0"
#define LINE_END "\r\n"
int ProcessNonCgi()
{
http_response.status_line =HTTP_VERSION;
http_response.status_line +=" ";
http_response.status_line +=std::to_string(http_response.status_code);
http_response.status_line +=" ";
http_response.status_line +=LINE_END;
return 0;
}
说明:
1.版本号,状态码 状态码的描述,中间都是用空格隔开的。
2.这里的状态码当时定义的是int类型,而这里因为要把它插入到string类型中的line中,所以要把它进行一步的转化,利用的是to_string函数。
3.我们这里默认以‘ \r\n ’作为统一的换行标志,因为我们之前已经自己写过统一的行处理了,这个时候就可以直接这样标志就行。
状态码描述的构建
我们之前通过定义宏来建立状态码和描述的联系,但是在这里我们可以构建一个函数,用switch语句来进行返回构建,来达到我们要的效果。
static std::string Code2Desc(int code)
{
std::string desc;
switch(code)
{
case 200:desc ="OK";
break;
case 404:desc ="Not Found";
break;
default:break;
}
return desc;
}
//....
http_response.status_line +=Code2Desc(http_response.status_code);
//....
发送报文
sendfile函数介绍
int ProcessNonCgi(int size)
{
http_response.fd =open(http_request.path.c_str(),O_RDONLY);
if(http_response.fd >= 0){
http_response.status_line =HTTP_VERSION;
http_response.status_line +=" ";
http_response.status_line +=std::to_string(http_response.status_code);
http_response.status_line +=" ";
http_res