@@ -17,6 +17,42 @@ use crate::mime::Mime;
1717use crate :: trailers:: { self , Trailers } ;
1818use crate :: { Body , Extensions , StatusCode , Version } ;
1919
20+ cfg_unstable ! {
21+ use crate :: upgrade;
22+ }
23+
24+ #[ cfg( not( feature = "unstable" ) ) ]
25+ pin_project_lite:: pin_project! {
26+ /// An HTTP response.
27+ ///
28+ /// # Examples
29+ ///
30+ /// ```
31+ /// # fn main() -> Result<(), http_types::Error> {
32+ /// #
33+ /// use http_types::{Response, StatusCode};
34+ ///
35+ /// let mut res = Response::new(StatusCode::Ok);
36+ /// res.set_body("Hello, Nori!");
37+ /// #
38+ /// # Ok(()) }
39+ /// ```
40+ #[ derive( Debug ) ]
41+ pub struct Response {
42+ status: StatusCode ,
43+ headers: Headers ,
44+ version: Option <Version >,
45+ trailers_sender: Option <sync:: Sender <Trailers >>,
46+ trailers_receiver: Option <sync:: Receiver <Trailers >>,
47+ #[ pin]
48+ body: Body ,
49+ ext: Extensions ,
50+ local_addr: Option <String >,
51+ peer_addr: Option <String >,
52+ }
53+ }
54+
55+ #[ cfg( feature = "unstable" ) ]
2056pin_project_lite:: pin_project! {
2157 /// An HTTP response.
2258 ///
@@ -37,8 +73,10 @@ pin_project_lite::pin_project! {
3773 status: StatusCode ,
3874 headers: Headers ,
3975 version: Option <Version >,
40- sender: Option <sync:: Sender <Trailers >>,
41- receiver: Option <sync:: Receiver <Trailers >>,
76+ trailers_sender: Option <sync:: Sender <Trailers >>,
77+ trailers_receiver: Option <sync:: Receiver <Trailers >>,
78+ upgrade_sender: Option <sync:: Sender <upgrade:: Connection >>,
79+ upgrade_receiver: Option <sync:: Receiver <upgrade:: Connection >>,
4280 #[ pin]
4381 body: Body ,
4482 ext: Extensions ,
@@ -49,6 +87,7 @@ pin_project_lite::pin_project! {
4987
5088impl Response {
5189 /// Create a new response.
90+ #[ cfg( not( feature = "unstable" ) ) ]
5291 pub fn new < S > ( status : S ) -> Self
5392 where
5493 S : TryInto < StatusCode > ,
@@ -57,14 +96,41 @@ impl Response {
5796 let status = status
5897 . try_into ( )
5998 . expect ( "Could not convert into a valid `StatusCode`" ) ;
60- let ( sender , receiver ) = sync:: channel ( 1 ) ;
99+ let ( trailers_sender , trailers_receiver ) = sync:: channel ( 1 ) ;
61100 Self {
62101 status,
63102 headers : Headers :: new ( ) ,
64103 version : None ,
65104 body : Body :: empty ( ) ,
66- sender : Some ( sender) ,
67- receiver : Some ( receiver) ,
105+ trailers_sender : Some ( trailers_sender) ,
106+ trailers_receiver : Some ( trailers_receiver) ,
107+ ext : Extensions :: new ( ) ,
108+ peer_addr : None ,
109+ local_addr : None ,
110+ }
111+ }
112+
113+ /// Create a new response.
114+ #[ cfg( feature = "unstable" ) ]
115+ pub fn new < S > ( status : S ) -> Self
116+ where
117+ S : TryInto < StatusCode > ,
118+ S :: Error : Debug ,
119+ {
120+ let status = status
121+ . try_into ( )
122+ . expect ( "Could not convert into a valid `StatusCode`" ) ;
123+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
124+ let ( upgrade_sender, upgrade_receiver) = sync:: channel ( 1 ) ;
125+ Self {
126+ status,
127+ headers : Headers :: new ( ) ,
128+ version : None ,
129+ body : Body :: empty ( ) ,
130+ trailers_sender : Some ( trailers_sender) ,
131+ trailers_receiver : Some ( trailers_receiver) ,
132+ upgrade_sender : Some ( upgrade_sender) ,
133+ upgrade_receiver : Some ( upgrade_receiver) ,
68134 ext : Extensions :: new ( ) ,
69135 peer_addr : None ,
70136 local_addr : None ,
@@ -457,7 +523,7 @@ impl Response {
457523 /// Sends trailers to the a receiver.
458524 pub fn send_trailers ( & mut self ) -> trailers:: Sender {
459525 let sender = self
460- . sender
526+ . trailers_sender
461527 . take ( )
462528 . expect ( "Trailers sender can only be constructed once" ) ;
463529 trailers:: Sender :: new ( sender)
@@ -466,12 +532,34 @@ impl Response {
466532 /// Receive trailers from a sender.
467533 pub async fn recv_trailers ( & mut self ) -> trailers:: Receiver {
468534 let receiver = self
469- . receiver
535+ . trailers_receiver
470536 . take ( )
471537 . expect ( "Trailers receiver can only be constructed once" ) ;
472538 trailers:: Receiver :: new ( receiver)
473539 }
474540
541+ /// Sends an upgrade connection to the a receiver.
542+ #[ cfg( feature = "unstable" ) ]
543+ #[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
544+ pub fn send_upgrade ( & mut self ) -> upgrade:: Sender {
545+ let sender = self
546+ . upgrade_sender
547+ . take ( )
548+ . expect ( "Upgrade sender can only be constructed once" ) ;
549+ upgrade:: Sender :: new ( sender)
550+ }
551+
552+ /// Receive an upgraded connection from a sender.
553+ #[ cfg( feature = "unstable" ) ]
554+ #[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
555+ pub async fn recv_upgrade ( & mut self ) -> upgrade:: Receiver {
556+ let receiver = self
557+ . upgrade_receiver
558+ . take ( )
559+ . expect ( "Upgrade receiver can only be constructed once" ) ;
560+ upgrade:: Receiver :: new ( receiver)
561+ }
562+
475563 /// An iterator visiting all header pairs in arbitrary order.
476564 pub fn iter ( & self ) -> headers:: Iter < ' _ > {
477565 self . headers . iter ( )
@@ -526,8 +614,12 @@ impl Clone for Response {
526614 status : self . status . clone ( ) ,
527615 headers : self . headers . clone ( ) ,
528616 version : self . version . clone ( ) ,
529- sender : self . sender . clone ( ) ,
530- receiver : self . receiver . clone ( ) ,
617+ trailers_sender : self . trailers_sender . clone ( ) ,
618+ trailers_receiver : self . trailers_receiver . clone ( ) ,
619+ #[ cfg( feature = "unstable" ) ]
620+ upgrade_sender : self . upgrade_sender . clone ( ) ,
621+ #[ cfg( feature = "unstable" ) ]
622+ upgrade_receiver : self . upgrade_receiver . clone ( ) ,
531623 body : Body :: empty ( ) ,
532624 ext : Extensions :: new ( ) ,
533625 peer_addr : self . peer_addr . clone ( ) ,
0 commit comments