From a96c82dea43fa51c0971557f0d232acafaf38fc5 Mon Sep 17 00:00:00 2001 From: Trisha Earley Date: Fri, 6 Nov 2020 18:47:04 +0000 Subject: [PATCH] :bug: Add content-length header when POSTing a response to the relay --- src/http_serde.rs | 3 +++ src/server/file_server.rs | 31 ++++++++++++++++++++----------- src/server/mod.rs | 13 +++++++++++-- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/http_serde.rs b/src/http_serde.rs index bdb40fd..0d94ad3 100644 --- a/src/http_serde.rs +++ b/src/http_serde.rs @@ -126,6 +126,9 @@ type Body = Receiver , std::convert::Infallible>>; pub struct Response { pub parts: ResponseParts, pub body: Option , + + // Needed to make Nginx happy + pub content_length: Option , } impl Response { diff --git a/src/server/file_server.rs b/src/server/file_server.rs index 7798121..b150296 100644 --- a/src/server/file_server.rs +++ b/src/server/file_server.rs @@ -120,11 +120,14 @@ async fn serve_dir ( path, entries, }).unwrap (); + let body = s.into_bytes (); let mut resp = http_serde::Response::default (); + resp.content_length = Some (body.len ().try_into ().unwrap ()); resp .header ("content-type".to_string (), "text/html".to_string ().into_bytes ()) - .body_bytes (s.into_bytes ()) + .header ("content-length".to_string (), body.len ().to_string ().into_bytes ()) + .body_bytes (body) ; resp } @@ -161,7 +164,7 @@ async fn serve_file ( //println! ("Opening file {:?}", path); let mut tx = tx; - //let mut bytes_sent = 0; + let mut bytes_sent = 0; let mut bytes_left = end - start; loop { @@ -177,16 +180,18 @@ async fn serve_file ( } if tx.send (Ok::<_, Infallible> (buffer)).await.is_err () { + eprintln! ("Send failed while streaming file ({} bytes sent)", bytes_sent); break; } bytes_left -= bytes_read; if bytes_left == 0 { + eprintln! ("Finished streaming file"); break; } - //bytes_sent += bytes_read; - //println! ("Sent {} bytes", bytes_sent); + bytes_sent += bytes_read; + println! ("Sent {} bytes", bytes_sent); //delay_for (Duration::from_millis (50)).await; } @@ -197,13 +202,17 @@ async fn serve_file ( response.header (String::from ("accept-ranges"), b"bytes".to_vec ()); - if range_start.is_none () && range_end.is_none () { - response.status_code (http_serde::StatusCode::Ok); - response.header (String::from ("content-length"), end.to_string ().into_bytes ()); - } - else { - response.status_code (http_serde::StatusCode::PartialContent); - response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", start, end - 1, end).into_bytes ()); + if should_send_body { + if range_start.is_none () && range_end.is_none () { + response.status_code (http_serde::StatusCode::Ok); + response.header (String::from ("content-length"), end.to_string ().into_bytes ()); + } + else { + response.status_code (http_serde::StatusCode::PartialContent); + response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", start, end - 1, end).into_bytes ()); + } + + response.content_length = Some (end - start); } if let Some (body) = body { diff --git a/src/server/mod.rs b/src/server/mod.rs index dfba1df..cf0b305 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -83,14 +83,23 @@ async fn handle_req_resp <'a> ( .post (&format! ("{}/http_response/{}", state.config.relay_url, req_id)) .header (crate::PTTH_MAGIC_HEADER, base64::encode (rmp_serde::to_vec (&response.parts).unwrap ())); + if let Some (length) = response.content_length { + resp_req = resp_req.header ("Content-Length", length.to_string ()); + } if let Some (body) = response.body { resp_req = resp_req.body (reqwest::Body::wrap_stream (body)); } + let req = resp_req.build ().unwrap (); + + eprintln! ("{:?}", req.headers ()); + //println! ("Step 6"); - if let Err (e) = resp_req.send ().await { - println! ("Err: {:?}", e); + match state.client.execute (req).await { + Ok (r) => eprintln! ("{:?} {:?}", r.status (), r.text ().await.unwrap ()), + Err (e) => eprintln! ("Err: {:?}", e), } + }); } }