TinyWebServer icon indicating copy to clipboard operation
TinyWebServer copied to clipboard

为什么write完成后,清空读缓冲区?

Open Jing0607101510 opened this issue 5 years ago • 1 comments

http_conn.h和http_conn.cpp中,如果read_once函数读取的数据跨越了前一个请求和后一个请求的HTTP报文,那么在调用write函数在某些条件下,调用了init()函数,清空了读缓冲区,那么后一个请求的一部分数据不就丢失了?

Jing0607101510 avatar Oct 06 '20 10:10 Jing0607101510

如果主线程中调用read_once,LT模式下只执行一次recv,读取到不完整的http请求,然后用http_conn::process()process_read就会返回NO_REQUEST,表示请求不完整,继续监听EPOLLIN事件。 不会执行到write函数

bluesea0 avatar Jul 11 '21 13:07 bluesea0

如果read_once函数读取的数据跨越了前一个请求和后一个请求的HTTP报文...

在 HTTP 1.1 中,单个 TCP 连接同时只能处理一个请求,虽然存在 Pipelining 技术支持多个请求同时发送,但由于实践中存在很多问题无法解决,所以浏览器默认是关闭,所以可以认为是不支持同时多个请求。也就是说,请求和应答是串行的,一来一回,不会存在读取的数据跨越了前后两个请求的 HTTP 报文。 https://stackoverflow.com/questions/30477476/why-is-pipelining-disabled-in-modern-browsers/40688337#40688337

ZuoFuhong avatar May 03 '23 11:05 ZuoFuhong