首页 > 解决方案 > 如何让 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);
}

标签: rust

解决方案


问题是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.
}

推荐阅读