39.应用层HTTP协议(二)
HTTP请求和响应结构中的Content-Length字段
client和server,怎么保证自己读到的报文是完整的?
1)读取字节流,分析读到的字节流,确认是否存在空行
2)提取Content-Length,获得正文长度,然后在读取或者截取指定长度的内容
Content-Length:正文部分的字节数。
代码细节1:
字符串流(stringstream)的分割机制
std::stringstream ss(req_line)
将输入字符串req_line
(即"GET / HTTP/1.1\r\n"
)包装为一个流对象。- 输入运算符
>>
在读取数据时,默认以空白字符(空格、制表符\t
、换行符\n
、回车符\r
等)作为分隔符,并自动跳过前导空白字符。
认识请求报头的两个属性:Content-Length 和 Content-Type
读取图片,视频,音频等文件时,不是文本类型的,是2进制(2进制,文本,都是字节流),因此读取的时候不能按照字符串的风格来读取,例如 '\0' ,'\n' 的方式读取,否则可能读不完。
因此正确的读取文件的方式是:
计算出文件大小,根据文件大小来读取,推荐的C++容器,std::vector<char>。也可以使用破坏封装性的std::string来读取,读取前先resize成文件大小。Content-Type对照:
Content-Type对照表
代码细节2:
实验验证
认识其他报头字段
- HOST:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent:声明用户的操作系统和浏览器版本信息;
- Refer:当前页面是从哪个页面跳转过来的;
代理服务器,用来实现负载均衡。
pachong本质:用HTTP客户端,来模拟浏览器行为,获取指定链接下的网页。
反pa:检查User-Agent,判断其是否为正常客户端发送的
代码:Linux-remote: linux远程仓库https://gitee.com/its-quite-six/linux-remote/tree/master/25_9_22/HTTP