From 119366e95720aa1b35e5bf79cd91255d6050e360 Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Thu, 9 Mar 2023 22:50:30 +0000 Subject: [PATCH] async/request: add methods to split and reassemble a RequestBuilder (#1770) This adds two methods to split and reassemble a `RequestBuilder`. It allows consumers to temporarily reach into the inner `Request` and later reconstruct the original builder. --- src/async_impl/request.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/async_impl/request.rs b/src/async_impl/request.rs index 914ff13ab..aaf97e940 100644 --- a/src/async_impl/request.rs +++ b/src/async_impl/request.rs @@ -177,6 +177,14 @@ impl RequestBuilder { } } + /// Assemble a builder starting from an existing `Client` and a `Request`. + pub fn from_parts(client: Client, request: Request) -> RequestBuilder { + RequestBuilder { + client, + request: crate::Result::Ok(request), + } + } + /// Add a `Header` to this Request. pub fn header(self, key: K, value: V) -> RequestBuilder where @@ -464,6 +472,15 @@ impl RequestBuilder { self.request } + /// Build a `Request`, which can be inspected, modified and executed with + /// `Client::execute()`. + /// + /// This is similar to [`RequestBuilder::build()`], but also returns the + /// embedded `Client`. + pub fn build_split(self) -> (Client, crate::Result) { + (self.client, self.request) + } + /// Constructs the Request and sends it to the target URL, returning a /// future Response. /// @@ -630,7 +647,7 @@ impl TryFrom for HttpRequest { #[cfg(test)] mod tests { - use super::{Client, HttpRequest, Request, Version}; + use super::{Client, HttpRequest, Request, RequestBuilder, Version}; use crate::Method; use serde::Serialize; use std::collections::BTreeMap; @@ -891,6 +908,18 @@ mod tests { assert_eq!(req.version(), Version::HTTP_11); } + #[test] + fn builder_split_reassemble() { + let builder = { + let client = Client::new(); + client.get("http://example.com") + }; + let (client, inner) = builder.build_split(); + let request = inner.unwrap(); + let builder = RequestBuilder::from_parts(client, request); + builder.build().unwrap(); + } + /* use {body, Method}; use super::Client;