如何在请求之后关闭服务器上的HTTP TCP流 我正在为Rust中的Prometheus服务器创建一个开放的度量http源。我宁愿避免拉动整个Web服务器库(板条箱),因为我控制基础架构,而HTTP/1.1很漂亮...

问题描述 投票:0回答:1
Curl:“ curl:(56)RECV失败:连接通过对等重置”

Firefox135:“在加载页面时,与服务器的连接重置”

Safari18.3:“ ...服务器出乎意料地丢弃了连接”
  • 我尝试添加“连接”和“内容长度”标头来尝试解决这个问题。现在,这就是NetCat的出现:
  • $ nc localhost 3003 HTTP/1.1 200 OK Content-Type: text/plain; version=0.0.4; charset=utf-8; escaping=underscores Connection: close Content-Length: 111 # HELP requests Number of requests received. # TYPE requests counter requests_total{method="Get"} 8 # EOF
  • 我让插座脱离范围。这是生锈的东西开始的地方:
let method = Method::Get; for stream in listener.incoming() { let mut stream = stream.unwrap(); metrics.inc_requests(method.clone()); println!("Connection established!"); let mut response_buffer = HTTP_HEADERS.to_string(); response_buffer.push_str(&format!("Content-Length: {}", response_buffer.len())); response_buffer.push_str("\n\n"); encode(&mut response_buffer, &registry).unwrap(); stream.write(response_buffer.as_bytes()).unwrap(); }

ahah,事实证明可以使用
shutdown

功能。我依靠插座范围范围。这也消除了内容长度的要求。这是解决方案。我敢肯定这不是特定于生锈的:

let method = Method::Get;
for stream in listener.incoming() {
    let mut stream = stream.unwrap();

    metrics.inc_requests(method.clone());

    println!("Connection established!");

    let mut response_buffer = HTTP_HEADERS.to_string();

    encode(&mut response_buffer, &registry).unwrap();

    stream.write(response_buffer.as_bytes()).unwrap();
    stream.shutdown(std::net::Shutdown::Both).unwrap();
}
http sockets rust network-protocols http-1.1
1个回答
0
投票
如果有人很好地参考了这一点,我很想看到它。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.