🐛 Add content-length header when POSTing a response to the relay
							parent
							
								
									690f07dab6
								
							
						
					
					
						commit
						a96c82dea4
					
				|  | @ -126,6 +126,9 @@ type Body = Receiver <Result <Vec <u8>, std::convert::Infallible>>; | |||
| pub struct Response { | ||||
| 	pub parts: ResponseParts, | ||||
| 	pub body: Option <Body>, | ||||
| 	
 | ||||
| 	// Needed to make Nginx happy
 | ||||
| 	pub content_length: Option <u64>, | ||||
| } | ||||
| 
 | ||||
| impl Response { | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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), | ||||
| 			} | ||||
| 			
 | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Trisha Earley
						Trisha Earley