@@ -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,11 @@ 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 >>,
80
+ has_upgrade: bool ,
42
81
#[ pin]
43
82
body: Body ,
44
83
ext: Extensions ,
@@ -49,6 +88,7 @@ pin_project_lite::pin_project! {
49
88
50
89
impl Response {
51
90
/// Create a new response.
91
+ #[ cfg( not( feature = "unstable" ) ) ]
52
92
pub fn new < S > ( status : S ) -> Self
53
93
where
54
94
S : TryInto < StatusCode > ,
@@ -57,14 +97,42 @@ impl Response {
57
97
let status = status
58
98
. try_into ( )
59
99
. expect ( "Could not convert into a valid `StatusCode`" ) ;
60
- let ( sender , receiver ) = sync:: channel ( 1 ) ;
100
+ let ( trailers_sender , trailers_receiver ) = sync:: channel ( 1 ) ;
61
101
Self {
62
102
status,
63
103
headers : Headers :: new ( ) ,
64
104
version : None ,
65
105
body : Body :: empty ( ) ,
66
- sender : Some ( sender) ,
67
- receiver : Some ( receiver) ,
106
+ trailers_sender : Some ( trailers_sender) ,
107
+ trailers_receiver : Some ( trailers_receiver) ,
108
+ ext : Extensions :: new ( ) ,
109
+ peer_addr : None ,
110
+ local_addr : None ,
111
+ }
112
+ }
113
+
114
+ /// Create a new response.
115
+ #[ cfg( feature = "unstable" ) ]
116
+ pub fn new < S > ( status : S ) -> Self
117
+ where
118
+ S : TryInto < StatusCode > ,
119
+ S :: Error : Debug ,
120
+ {
121
+ let status = status
122
+ . try_into ( )
123
+ . expect ( "Could not convert into a valid `StatusCode`" ) ;
124
+ let ( trailers_sender, trailers_receiver) = sync:: channel ( 1 ) ;
125
+ let ( upgrade_sender, upgrade_receiver) = sync:: channel ( 1 ) ;
126
+ Self {
127
+ status,
128
+ headers : Headers :: new ( ) ,
129
+ version : None ,
130
+ body : Body :: empty ( ) ,
131
+ trailers_sender : Some ( trailers_sender) ,
132
+ trailers_receiver : Some ( trailers_receiver) ,
133
+ upgrade_sender : Some ( upgrade_sender) ,
134
+ upgrade_receiver : Some ( upgrade_receiver) ,
135
+ has_upgrade : false ,
68
136
ext : Extensions :: new ( ) ,
69
137
peer_addr : None ,
70
138
local_addr : None ,
@@ -469,7 +537,7 @@ impl Response {
469
537
/// Sends trailers to the a receiver.
470
538
pub fn send_trailers ( & mut self ) -> trailers:: Sender {
471
539
let sender = self
472
- . sender
540
+ . trailers_sender
473
541
. take ( )
474
542
. expect ( "Trailers sender can only be constructed once" ) ;
475
543
trailers:: Sender :: new ( sender)
@@ -478,12 +546,43 @@ impl Response {
478
546
/// Receive trailers from a sender.
479
547
pub async fn recv_trailers ( & mut self ) -> trailers:: Receiver {
480
548
let receiver = self
481
- . receiver
549
+ . trailers_receiver
482
550
. take ( )
483
551
. expect ( "Trailers receiver can only be constructed once" ) ;
484
552
trailers:: Receiver :: new ( receiver)
485
553
}
486
554
555
+ /// Sends an upgrade connection to the a receiver.
556
+ #[ cfg( feature = "unstable" ) ]
557
+ #[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
558
+ pub fn send_upgrade ( & mut self ) -> upgrade:: Sender {
559
+ self . has_upgrade = true ;
560
+ let sender = self
561
+ . upgrade_sender
562
+ . take ( )
563
+ . expect ( "Upgrade sender can only be constructed once" ) ;
564
+ upgrade:: Sender :: new ( sender)
565
+ }
566
+
567
+ /// Receive an upgraded connection from a sender.
568
+ #[ cfg( feature = "unstable" ) ]
569
+ #[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
570
+ pub async fn recv_upgrade ( & mut self ) -> upgrade:: Receiver {
571
+ self . has_upgrade = true ;
572
+ let receiver = self
573
+ . upgrade_receiver
574
+ . take ( )
575
+ . expect ( "Upgrade receiver can only be constructed once" ) ;
576
+ upgrade:: Receiver :: new ( receiver)
577
+ }
578
+
579
+ /// Returns `true` if a protocol upgrade is in progress.
580
+ #[ cfg( feature = "unstable" ) ]
581
+ #[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
582
+ pub fn has_upgrade ( & self ) -> bool {
583
+ self . has_upgrade
584
+ }
585
+
487
586
/// An iterator visiting all header pairs in arbitrary order.
488
587
pub fn iter ( & self ) -> headers:: Iter < ' _ > {
489
588
self . headers . iter ( )
@@ -539,8 +638,14 @@ impl Clone for Response {
539
638
status : self . status . clone ( ) ,
540
639
headers : self . headers . clone ( ) ,
541
640
version : self . version . clone ( ) ,
542
- sender : self . sender . clone ( ) ,
543
- receiver : self . receiver . clone ( ) ,
641
+ trailers_sender : self . trailers_sender . clone ( ) ,
642
+ trailers_receiver : self . trailers_receiver . clone ( ) ,
643
+ #[ cfg( feature = "unstable" ) ]
644
+ upgrade_sender : self . upgrade_sender . clone ( ) ,
645
+ #[ cfg( feature = "unstable" ) ]
646
+ upgrade_receiver : self . upgrade_receiver . clone ( ) ,
647
+ #[ cfg( feature = "unstable" ) ]
648
+ has_upgrade : false ,
544
649
body : Body :: empty ( ) ,
545
650
ext : Extensions :: new ( ) ,
546
651
peer_addr : self . peer_addr . clone ( ) ,
0 commit comments