http请求
在可以进行网络通信之后,我们需要知道浏览器和我的服务器之间通信的规则
首先浏览器在和我的服务器建立通信之后会发出一个http请求到我的服务器
一个http请求的组成为:一个请求行,后面跟随零个或多个请求报头,然后是一个空的文本行来结束报头
后面接着是请求体
然后每一行的结尾都是\r\n
,空行就是只有\r\n
请求行
请求行的格式为<method> <url> <version>
method就是请求的方法包括GET,POST,OPTIONS,HEAD,PUT,
DELETE,TRACE等,这次就先实现最基本的GET方法,报头就先忽略
url就是资源定位符
version就是http版本
http响应
在服务器接受请求并进行一系列处理之后会构造一个http响应给浏览器,一个http响应的组成和http请求很像,一个响应行,后面接若干行响应报头,然后是一个终止报头的空行,再跟随一个响应体
响应行
响应行的格式为<version> <status code> <status message>
version是http版本
status code是状态码,参考
status message是状态的英文描述
响应报头
最重要的两个报头就是Content-Type
它告诉客户端响应主体中的内容的类型,以及Content-Length
报头用来告诉客户端响应主体的字节大小
响应体
响应体就是被请求的内容
代码实现
读取一行
首先我们需要分析请求,因为http请求的每一行都是\r\n
结尾的,我们可以写一个函数来一行一行的读入
1 | http_conn::READ_LINE_STATUS http_conn::HttpConn::readLine()//读取一行请求 |
READ_LINE_STATUS
是读取一行的状态,分别有三个为LINE_OK
代表成功读取一行,LINE_OPEN
代表正在读取一行,LINE_BAD
代表读取错误即不是以\r\n
结尾
在成功读取一行之后我们要对它进行处理
处理请求
处理请求也有三种状态,处理请求行,处理请求头,处理请求体
1 | http_conn::HTTP_CODE http_conn::HttpConn::parse_request()//处理http请求 |
requestreadstatus
就是处理请求的三个状态,在每一个状态处理完之后会进行状态转移
这是处理整个请求的函数,其中有处理请求行的函数parse_requestline()
处理请求行
1 | http_conn::HTTP_CODE http_conn::HttpConn::parse_requestline()//处理请求行 |
处理请求头
处理请求头的函数parse_requesthead()
还没有具体实现,只是读进来
1 | http_conn::HTTP_CODE http_conn::HttpConn::parse_requesthead()//处理请求头 |
处理请求体
处理请求体的函数parse_requestbody()
同样还没具体实现
1 | http_conn::HTTP_CODE http_conn::HttpConn::parse_requestbody()//处理请求体 |
分析url
1 | int http_conn::HttpConn::parse_uri()//解析请求的资源 |
其中cgiargs是处理动态资源的时候会用到,现在还用不到,默认静态资源放在程序同级目录的static
文件夹下,动态资源放在cgi-bin
文件夹下
处理静态请求(动态请求还未实现)
1 | http_conn::HTTP_CODE http_conn::HttpConn::parse_static_request()//处理静态请求 |
处理错误信息
对于失败的请求我们要返回错误信息
1 | void http_conn::HttpConn::parse_error()//处理错误信息 |
初始化
我们最后实现初始化这个类HttpConn
1 | void http_conn::HttpConn::init() |
为了测试先这样写,之后肯定会改的
整个类的定义放到最后吧
测试
我没放文件返回了404
类的定义
1 |
|