Skip to content

Commit 6721feb

Browse files
authored
Merge pull request #103 from http-rs/fix-trailers
Make recv_trailers return a concrete type
2 parents 42c70ac + cab9afa commit 6721feb

File tree

3 files changed

+64
-25
lines changed

3 files changed

+64
-25
lines changed

src/request.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::headers::{
1010
self, HeaderName, HeaderValue, Headers, Names, ToHeaderValues, Values, CONTENT_TYPE,
1111
};
1212
use crate::mime::Mime;
13-
use crate::trailers::{Trailers, TrailersSender};
13+
use crate::trailers::{self, Trailers};
1414
use crate::Cookie;
1515
use crate::{Body, Method, TypeMap, Url, Version};
1616

@@ -31,8 +31,8 @@ pin_project_lite::pin_project! {
3131
url: Url,
3232
headers: Headers,
3333
version: Option<Version>,
34-
sender: Option<sync::Sender<crate::Result<Trailers>>>,
35-
receiver: sync::Receiver<crate::Result<Trailers>>,
34+
sender: Option<sync::Sender<Trailers>>,
35+
receiver: Option<sync::Receiver<Trailers>>,
3636
#[pin]
3737
body: Body,
3838
local: TypeMap,
@@ -50,7 +50,7 @@ impl Request {
5050
version: None,
5151
body: Body::empty(),
5252
sender: Some(sender),
53-
receiver,
53+
receiver: Some(receiver),
5454
local: TypeMap::new(),
5555
}
5656
}
@@ -431,17 +431,21 @@ impl Request {
431431
}
432432

433433
/// Sends trailers to the a receiver.
434-
pub fn send_trailers(&mut self) -> TrailersSender {
434+
pub fn send_trailers(&mut self) -> trailers::Sender {
435435
let sender = self
436436
.sender
437437
.take()
438438
.expect("Trailers sender can only be constructed once");
439-
TrailersSender::new(sender)
439+
trailers::Sender::new(sender)
440440
}
441441

442442
/// Receive trailers from a sender.
443-
pub async fn recv_trailers(&self) -> Option<crate::Result<Trailers>> {
444-
self.receiver.recv().await
443+
pub async fn recv_trailers(&mut self) -> trailers::Receiver {
444+
let receiver = self
445+
.receiver
446+
.take()
447+
.expect("Trailers receiver can only be constructed once");
448+
trailers::Receiver::new(receiver)
445449
}
446450

447451
/// An iterator visiting all header pairs in arbitrary order.

src/response.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::headers::{
1010
self, HeaderName, HeaderValue, Headers, Names, ToHeaderValues, Values, CONTENT_TYPE,
1111
};
1212
use crate::mime::Mime;
13-
use crate::trailers::{Trailers, TrailersSender};
13+
use crate::trailers::{self, Trailers};
1414
use crate::{Body, Cookie, StatusCode, TypeMap, Version};
1515

1616
pin_project_lite::pin_project! {
@@ -33,8 +33,8 @@ pin_project_lite::pin_project! {
3333
status: StatusCode,
3434
headers: Headers,
3535
version: Option<Version>,
36-
sender: Option<sync::Sender<crate::Result<Trailers>>>,
37-
receiver: sync::Receiver<crate::Result<Trailers>>,
36+
sender: Option<sync::Sender<Trailers>>,
37+
receiver: Option<sync::Receiver<Trailers>>,
3838
#[pin]
3939
body: Body,
4040
local: TypeMap,
@@ -51,7 +51,7 @@ impl Response {
5151
version: None,
5252
body: Body::empty(),
5353
sender: Some(sender),
54-
receiver,
54+
receiver: Some(receiver),
5555
local: TypeMap::new(),
5656
}
5757
}
@@ -396,17 +396,21 @@ impl Response {
396396
}
397397

398398
/// Sends trailers to the a receiver.
399-
pub fn send_trailers(&mut self) -> TrailersSender {
399+
pub fn send_trailers(&mut self) -> trailers::Sender {
400400
let sender = self
401401
.sender
402402
.take()
403403
.expect("Trailers sender can only be constructed once");
404-
TrailersSender::new(sender)
404+
trailers::Sender::new(sender)
405405
}
406406

407407
/// Receive trailers from a sender.
408-
pub async fn recv_trailers(&self) -> Option<crate::Result<Trailers>> {
409-
self.receiver.recv().await
408+
pub async fn recv_trailers(&mut self) -> trailers::Receiver {
409+
let receiver = self
410+
.receiver
411+
.take()
412+
.expect("Trailers receiver can only be constructed once");
413+
trailers::Receiver::new(receiver)
410414
}
411415

412416
/// An iterator visiting all header pairs in arbitrary order.

src/trailers.rs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@
3434
//! trailers.insert("Content-Type", "text/plain")?;
3535
//!
3636
//! task::spawn(async move {
37-
//! let _trailers = req.recv_trailers().await;
37+
//! let trailers = req.recv_trailers().await;
38+
//! # drop(trailers)
3839
//! });
3940
//!
40-
//! sender.send(Ok(trailers)).await;
41+
//! sender.send(trailers).await;
4142
//! #
4243
//! # Ok(()) })}
4344
//! ```
@@ -49,10 +50,14 @@
4950
use crate::headers::{
5051
HeaderName, HeaderValue, Headers, Iter, IterMut, Names, ToHeaderValues, Values,
5152
};
52-
use async_std::sync::Sender;
53+
use async_std::prelude::*;
54+
use async_std::sync;
5355

5456
use std::convert::TryInto;
57+
use std::future::Future;
5558
use std::ops::{Deref, DerefMut};
59+
use std::pin::Pin;
60+
use std::task::{Context, Poll};
5661

5762
/// A collection of trailing HTTP headers.
5863
#[derive(Debug)]
@@ -182,21 +187,47 @@ impl DerefMut for Trailers {
182187
/// called once, and cannot be cloned. That's because only a single instance of
183188
/// `Trailers` should be created.
184189
#[derive(Debug)]
185-
pub struct TrailersSender {
186-
sender: Sender<crate::Result<Trailers>>,
190+
pub struct Sender {
191+
sender: sync::Sender<Trailers>,
187192
}
188193

189-
impl TrailersSender {
190-
/// Create a new instance of `TrailersSender`.
194+
impl Sender {
195+
/// Create a new instance of `Sender`.
191196
#[doc(hidden)]
192-
pub fn new(sender: Sender<crate::Result<Trailers>>) -> Self {
197+
pub fn new(sender: sync::Sender<Trailers>) -> Self {
193198
Self { sender }
194199
}
195200

196201
/// Send a `Trailer`.
197202
///
198203
/// The channel will be consumed after having sent trailers.
199-
pub async fn send(self, trailers: crate::Result<Trailers>) {
204+
pub async fn send(self, trailers: Trailers) {
200205
self.sender.send(trailers).await
201206
}
202207
}
208+
209+
/// The receiving half of a channel to send trailers.
210+
///
211+
/// Unlike `async_std::sync::channel` the `send` method on this type can only be
212+
/// called once, and cannot be cloned. That's because only a single instance of
213+
/// `Trailers` should be created.
214+
#[must_use = "Futures do nothing unless polled or .awaited"]
215+
#[derive(Debug)]
216+
pub struct Receiver {
217+
receiver: sync::Receiver<Trailers>,
218+
}
219+
220+
impl Receiver {
221+
/// Create a new instance of `Receiver`.
222+
pub(crate) fn new(receiver: sync::Receiver<Trailers>) -> Self {
223+
Self { receiver }
224+
}
225+
}
226+
227+
impl Future for Receiver {
228+
type Output = Option<Trailers>;
229+
230+
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
231+
Pin::new(&mut self.receiver).poll_next(cx)
232+
}
233+
}

0 commit comments

Comments
 (0)