WebServer项目——HTTPresponse详解
WebServer项目——HTTPresponse详解
HTTPresponse简介
这个类和HTTPrequest相反,是给相应的连接生成相应报文的。HTTPrequest是解析请求行,请求头和数据体,那么HTTPresponse就是生成请求行,请求头和数据体。
HTTPresponse的组成
所需变量和自定义的数据结构
首先,我们需要一个变量code_
来代表HTTP的状态。
在HTTPrequest中解析到的路径信息是相对路径,我们还需要补全,所以需要一个变量path_
代表解析得到的路径,一个变量srcDir_
表示根目录,除此之外,我们还需要一个哈希表提供4XX状态码到响应文件路径的映射。
我们在实现所需函数的过程中,需要知道HTTP连接是否处于KeepAlive状态,所以用一个变量isKeepAlive_
表示。
由于使用了共享内存,所以也需要变量和数据结构指示相关信息:
1 | char* mmFile_; |
所以,总结如下:
1 | int code_; |
其中,哈希表SUFFIX_TYPE表示后缀名到文件类型的映射关系,哈希表CODE_STATUS表示状态码到相应状态(字符串类型)的映射。
构造函数和析构函数
这个类中的构造函数和析构函数就是默认的,不需要做什么操作。虽然会有初始化的函数,但是不需要在这里初始化,因为需要初始化srcDir在这里没法获取。
生成响应报文函数
这个类的主要部分就是就是生成相应报文,也就是生成请求行,请求头和数据体,分别对应以下函数:
1 | void addStateLine_(Buffer& buffer); |
在设计的时候,对于4XX的状态码是分开考虑的,这部分由函数:
1 | void errorHTML_(); |
实现。
在添加请求头的时候,我们需要得到文件类型信息,这个由函数:
1 | std::string getFileType_(); |
实现。
在添加数据体的函数中,如果所请求的文件打不开,我们需要返回相应的错误信息,这个功能由函数:
1 | void errorContent(Buffer& buffer,std::string message); |
实现。
最后,生成响应报文的主函数为:
1 | void makeResponse(Buffer& buffer); |
暴露给外界的接口
返回状态码的函数:
1 | int code() const {return code_;} |
返回文件信息的函数:
1 | char* file(); |
其他函数
初始化函数:
1 | void init(const std::string& srcDir,std::string& path,bool isKeepAlive=false,int code=-1); |
共享内存的扫尾函数:
1 | void unmapFile_(); |
HTTPresponse的实现
1 | class HTTPresponse |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!