微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在没有 HTTP 库的情况下发送 404 HTTP 响应?

如何解决如何在没有 HTTP 库的情况下发送 404 HTTP 响应?

这更多的是为了了解事情是如何工作的,所以请不要建议使用 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 响应。当我在浏览器中运行并访问页面时,我得到以下内容

enter image description here

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

我也试过 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; 
        });
    }
}

解决方法

您缺少几个 \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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。