【问题标题】:How do I send a 404 HTTP response without a HTTP library?如何在没有 HTTP 库的情况下发送 404 HTTP 响应?
【发布时间】:2021-09-03 23:15:11
【问题描述】:

这更多是为了了解事情是如何工作的,所以请不要建议使用 HTTP 库。

我有以下代码

use tokio::net::{TcpListener, TcpStream};

use std::error::Error;

async fn process_socket(mut socket: TcpStream) {
    socket
        .write_all(b"HTTP/1.1 404
Content-Length: 0")
        .await
        .expect("failed to write data to socket");
    socket
        .flush()
        .await
        .expect("failed to flush socket");    
}

根据这个question,它应该是一个有效的最小 HTTP 响应。当我在浏览器中运行并访问该页面时,我得到以下信息

请注意,该列中没有状态,并且似乎无法识别该消息。

我也试过 safari,上面写着...

“无法解析响应”(NSURLErrorDomain:-1017)

我错过了什么?

剩下的代码是……

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let addr = "127.0.0.1:8080";
    let listener = TcpListener::bind(&addr).await?;
    println!("Listening on: {}", addr);
    loop{
        let (socket, _) = listener.accept().await?;
        tokio::spawn(async move {
            // In a loop, read data from the socket and write the data back.
            process_socket(socket).await; 
        });
    }
}

【问题讨论】:

    标签: http rust tcp tokio


    【解决方案1】:

    您缺少几个 \r\n 分隔符。标头必须由一对这样的对分隔,并且响应的标头部分必须由两个这样的对终止:

    .write_all(b"HTTP/1.1 404\r\nContent-Length: 0\r\n\r\n")
    

    From the spec

    Response      = Status-Line               ; Section 6.1
                           *(( general-header        ; Section 4.5
                            | response-header        ; Section 6.2
                            | entity-header ) CRLF)  ; Section 7.1
                           CRLF
                           [ message-body ]          ; Section 7.2
    

    【讨论】:

    • 我认为它会推断 Rust 中的换行符我认为这不需要明确。这里的情况有什么特别的原因吗?另外你为什么使用windows版本的换行符?谢谢
    • http 规范需要 CRLF。文件中的换行符取决于操作系统和 IDE——例如在我的 linux 和 mac 盒子上它们只是 LF。 Rust 编译器不可能知道这是一个 HTTP 响应体以便自动修复它们
    • 我没有意识到 http 需要 crlf 谢谢
    猜你喜欢
    • 2013-05-08
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2019-02-20
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多