@@ -17,6 +17,42 @@ use crate::mime::Mime;
17
17
use crate :: trailers:: { self , Trailers } ;
18
18
use crate :: { Body , Extensions , StatusCode , Version } ;
19
19
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" ) ]
20
56
pin_project_lite:: pin_project! {
21
57
/// An HTTP response.
22
58
///
@@ -37,8 +73,10 @@ pin_project_lite::pin_project! {
37
73
status: StatusCode ,
38
74
headers: Headers ,
39
75
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 >>,
42
80
#[ pin]
43
81
body: Body ,
44
82
ext: Extensions ,
@@ -49,6 +87,7 @@ pin_project_lite::pin_project! {
49
87
50
88
impl Response {
51
89
/// Create a new response.
90
+ #[ cfg( not( feature = "unstable" ) ) ]
52
91
pub fn new < S > ( status : S ) -> Self
53
92
where
54
93
S : TryInto < StatusCode > ,
@@ -57,14 +96,41 @@ impl Response {
57
96
let status = status
58
97
. try_into ( )
59
98
. expect ( "Could not convert into a valid `StatusCode`" ) ;
60
- let ( sender , receiver ) = sync:: channel ( 1 ) ;
99
+ let ( trailers_sender , trailers_receiver ) = sync:: channel ( 1 ) ;
61
100
Self {
62
101
status,
63
102
headers : Headers :: new ( ) ,
64
103
version : None ,
65
104
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) ,
68
134
ext : Extensions :: new ( ) ,
69
135
peer_addr : None ,
70
136
local_addr : None ,
@@ -457,7 +523,7 @@ impl Response {
457
523
/// Sends trailers to the a receiver.
458
524
pub fn send_trailers ( & mut self ) -> trailers:: Sender {
459
525
let sender = self
460
- . sender
526
+ . trailers_sender
461
527
. take ( )
462
528
. expect ( "Trailers sender can only be constructed once" ) ;
463
529
trailers:: Sender :: new ( sender)
@@ -466,12 +532,34 @@ impl Response {
466
532
/// Receive trailers from a sender.
467
533
pub async fn recv_trailers ( & mut self ) -> trailers:: Receiver {
468
534
let receiver = self
469
- . receiver
535
+ . trailers_receiver
470
536
. take ( )
471
537
. expect ( "Trailers receiver can only be constructed once" ) ;
472
538
trailers:: Receiver :: new ( receiver)
473
539
}
474
540
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
+
475
563
/// An iterator visiting all header pairs in arbitrary order.
476
564
pub fn iter ( & self ) -> headers:: Iter < ' _ > {
477
565
self . headers . iter ( )
@@ -526,8 +614,12 @@ impl Clone for Response {
526
614
status : self . status . clone ( ) ,
527
615
headers : self . headers . clone ( ) ,
528
616
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 ( ) ,
531
623
body : Body :: empty ( ) ,
532
624
ext : Extensions :: new ( ) ,
533
625
peer_addr : self . peer_addr . clone ( ) ,
0 commit comments