rust - 如何让 httparse 正确解析我的请求?
问题描述
我通过使用 TcpListener 设置了一个 api,当尝试使用 httparse 解析请求数据中的标头时,它只返回Err(HeaderName)
. 我还检查了,我可以通过打印请求数据来确认我收到了完整的请求。
fn main() {
let listener = TcpListener::bind("127.0.0.1:2352").unwrap();
for stream in listener.incoming() {
let stream = stream.unwrap();
handle_connection(stream);
}
}
fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let mut headers = [httparse::EMPTY_HEADER; 4];
let parsed_headers = httparse::parse_headers(&buffer, &mut headers);
let response = "HTTP/1.1 200 OK\r\n\r\n";
stream.write(response.as_bytes()).unwrap();
stream.flush().unwrap();
println!("Request Headers: {:?}", parsed_headers);
}
解决方案
问题是httparse::parse_headers()
它只解析 HTTP 标头,而不是完整的 HTTP 请求。它期望您传入的缓冲区仅包含标题和正文。换句话说,该parse_headers()
函数需要这样的东西:
Header1: Value1
Header2: Value2
Header3: Value3
This is the body.
但是一个完整的 HTTP 请求看起来像这样:
GET / HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3
这就是它的绊脚石。
要解析完整的请求,您应该使用该httparse::Request
结构,如下所示:
fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let mut headers = [httparse::EMPTY_HEADER; 4];
let mut req = httparse::Request::new(&mut headers);
let res = req.parse(&buffer).unwrap();
// Here, ``res`` is an Err() if something went wrong, and Ok otherwise.
// The ``req`` variable contains the request properties, and
// the ``headers`` variable contains the headers.
}