H3: introduce builder pattern for client request

This commit is contained in:
stammw
2019-09-01 16:44:27 +02:00
committed by Dirkjan Ochtman
parent 436f1cd511
commit 6950e350ea
2 changed files with 33 additions and 15 deletions
+3 -1
View File
@@ -289,7 +289,9 @@ fn client(
HeaderValue::from_str("trailer").expect("trailer value"),
);
conn.send_request_trailers(request, trailer)
conn.request(request)
.trailers(trailer)
.send()
.map_err(|e| format_err!("send request: {}", e))
.and_then(|response| {
println!("received response: {:?}", response);
+30 -14
View File
@@ -85,21 +85,12 @@ impl Client {
pub struct Connection(ConnectionRef);
impl Connection {
pub fn send_request<T: Into<Body>>(&self, request: Request<T>) -> SendRequest {
SendRequest::new(request, None, self.0.quic.open_bi(), self.0.clone())
}
pub fn send_request_trailers<T: Into<Body>>(
&self,
request: Request<T>,
trailers: HeaderMap,
) -> SendRequest {
SendRequest::new(
pub fn request<T: Into<Body>>(&self, request: Request<T>) -> ReqBuilder<T> {
ReqBuilder {
request,
Some(trailers),
self.0.quic.open_bi(),
self.0.clone(),
)
trailers: None,
conn: self.0.clone(),
}
}
}
@@ -129,6 +120,31 @@ impl Future for Connecting {
}
}
pub struct ReqBuilder<T> {
conn: ConnectionRef,
request: Request<T>,
trailers: Option<HeaderMap>,
}
impl<T> ReqBuilder<T>
where
T: Into<Body>,
{
pub fn trailers(mut self, trailers: HeaderMap) -> Self {
self.trailers = Some(trailers);
self
}
pub fn send(self) -> SendRequest {
SendRequest::new(
self.request,
self.trailers,
self.conn.quic.open_bi(),
self.conn,
)
}
}
enum SendRequestState {
Opening(OpenBi),
Sending(SendHeaders),