From b85cb4274d6c4e443480f965f3f670f8b8fee2eb Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 8 Sep 2020 02:42:05 -0400 Subject: [PATCH] WIP retry - works! --- src/speak_proxy.rs | 53 +++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/speak_proxy.rs b/src/speak_proxy.rs index 60700e1..8c9105f 100644 --- a/src/speak_proxy.rs +++ b/src/speak_proxy.rs @@ -35,26 +35,25 @@ struct RequestDetails { pub speaker: String, } -pub fn copy_request(request: &Request) -> Request { - let mut cloned = Request::builder() - .body(Body::from("")) +/*pub fn copy_request(request: &Request) -> Request { + /*let body_bytes = hyper::body::to_bytes(request.body()); + println!("Body Bytes: {:?}", body_bytes); + + let body = Body::from("");*/ + let body_bytes = hyper::body::to_bytes(request.body()) .unwrap(); - request.clone_into(&mut &cloned); + let body_string = String::from_utf8_lossy(&body_bytes); + let data = request.body().data(); - /*let body_bytes = hyper::body::to_bytes(request.body()); - let body = Body::from(body_bytes); - Body::from(request.body()); Request::builder() .uri(request.uri()) .method(request.method()) - .body(body) - .unwrap()*/ - - cloned -} + .body(Body::from("")) + .unwrap() +}*/ pub async fn speak_proxy_with_retry( ip_addr: IpAddr, @@ -63,12 +62,35 @@ pub async fn speak_proxy_with_retry( _transaction: MaybeNewRelicTransaction, endpoint: &'static str) -> Result, ResponseError> { - let mut attempt = 0; + let mut attempt : u8 = 0; + + let headers = req.headers().clone(); + + let (_, body) = req.into_parts(); + + let body_bytes = hyper::body::to_bytes(body) + .await + .unwrap(); + + let body_string = String::from_utf8(body_bytes.as_ref().to_vec()) + .unwrap(); + + println!("Body: {:?}", body_string); loop { info!("Attempt #{}", attempt); - let request = copy_request(&req); + let mut request_builder = Request::builder(); + + for (k, v) in headers.iter() { + // NB: Builder pattern ownership + request_builder = request_builder.header(k.clone(), v.clone()); + } + + let request = request_builder + .body(Body::from(body_string.clone())) + .unwrap(); + let transaction = MaybeNewRelicTransaction::from_optional(None); let result = speak_proxy(ip_addr, request, router.clone(), transaction, endpoint).await; @@ -119,7 +141,7 @@ pub async fn speak_proxy( headers.insert(HeaderName::from_static("x-voder-proxy-for"), upstream_client_ip.clone()); headers.insert(HeaderName::from_static("x-gateway-ip"), gateway_ip); - let (parts, body) = req.into_parts(); + let (_parts, body) = req.into_parts(); let request_bytes = body .try_fold(Vec::new(), |mut data, chunk| async move { @@ -129,6 +151,7 @@ pub async fn speak_proxy( .await .unwrap(); + println!("Requeest bytes: {:?}", request_bytes); let request = serde_json::from_slice::(&request_bytes) .unwrap();