http

2019-08-12

继挖坑 tinyshell 之后,又挖新坑 tinyserver, 主要是想深入研究一下网络编程的一些细节,多进程/多线程/select/poll/epoll 这些。这里记录一下我的思考,可能有误,请谨慎参考:

问题:服务器如何判断请求报文发送结束?

要想清楚这个问题,就要从http报文结构入手,一个http请求报文是长这样:

请求行\r\n
若干头部字段\r\n
若干头部字段\r\n
若干头部字段\r\n
\r\n
请求体(下图中的请求数据)

找张网上流传图片,看得更清晰

http-request-package

所以这里可以分为两种情况:

对于没有请求体的请求,在报文最后就是:最后一个头字段后面的换行符,加上头字段和请求体之间的换行符,也就是读取到\r\n\r\n时,就可以判断报文已经结束了。

而对于有请求体的请求(比如post请求,就会把数据放在请求体中),在\r\n\r\n后面,还要继续读请求体的数据。而请求体的长度,能够通过请求头部中的Content-length中获得。所以如果在请求头中发现有Content-length字段,就还需在\r\n\r\n后面再继续读取Content-length所指示的字节数。

结语:

按照这个思路,我实现了代码具体可看 这里