出于学术目的,我正在从头开始实施 HTTP/1.1 协议。我已经实现了 app.set('views', path.join(__dirname, '../views'));
app.set('view engine', 'ejs');
app.use(favicon(path.join(__dirname, '../public/visitele.ico')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false, limit: '50mb'}));
app.use(cookieParser());
app.use(cors());
app.use(express.static(path.join(__dirname, '../public')));
app.use('/static', express.static(path.join(__dirname, '../static')));
,它从传递的缓冲区中连续构建请求对象。这是处理打开的套接字的代码。
RequestBuilder
async fn process_socket(stream: TcpStream) -> Result<Request> {
let mut request_builder = RequestBuilder::new();
let mut buffer: [u8; 1024] = unsafe { MaybeUninit::uninit().assume_init() };
loop {
stream.readable().await?;
match stream.try_read(&mut buffer) {
Ok(0) => {
break;
}
Ok(n) => (),
Err(ref e) if e.kind() == ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
return Err(e.into());
}
}
request_builder.parse(&buffer);
}
let request = request_builder.build()?;
Ok(request)
}
将获取缓冲区的下一部分并进一步解析请求。我的问题是,当客户端发送整个请求时如何打破循环。当我使用 request_builder.parse(&buffer);
向服务器发出请求时,整个请求都会被解析。
在读取整个请求流后,循环将被打破。
在将整个请求读入缓冲区后,循环卡在 curl localhost:8080
处。目前,当我使用 stream.readable().await?;
杀死 curl
命令时,使用 Ctrl+C
中断循环,但我希望它在阅读 who 后中断
答案 0 :(得分:1)
您需要解释 HTTP 请求,因为 TCP 连接不会被客户端半关闭。除非客户端发送更多数据(这违反了 HTTP 规范),否则客户端的 FIN
会违反协议)是 readable()
返回(带有 Err
)的唯一方式。>