5
5
use std:: fmt:: { self , Write } ;
6
6
use std:: mem;
7
7
8
+ #[ cfg( feature = "ffi" ) ]
9
+ use bytes:: Bytes ;
8
10
use bytes:: BytesMut ;
9
11
use http:: header:: { self , Entry , HeaderName , HeaderValue } ;
10
12
use http:: { HeaderMap , Method , StatusCode , Version } ;
@@ -660,7 +662,7 @@ impl Http1Transaction for Client {
660
662
loop {
661
663
// Unsafe: see comment in Server Http1Transaction, above.
662
664
let mut headers_indices: [ HeaderIndices ; MAX_HEADERS ] = unsafe { mem:: uninitialized ( ) } ;
663
- let ( len, status, version, headers_len) = {
665
+ let ( len, status, reason , version, headers_len) = {
664
666
let mut headers: [ httparse:: Header < ' _ > ; MAX_HEADERS ] =
665
667
unsafe { mem:: uninitialized ( ) } ;
666
668
trace ! (
@@ -674,14 +676,28 @@ impl Http1Transaction for Client {
674
676
httparse:: Status :: Complete ( len) => {
675
677
trace ! ( "Response.parse Complete({})" , len) ;
676
678
let status = StatusCode :: from_u16 ( res. code . unwrap ( ) ) ?;
679
+
680
+ #[ cfg( not( feature = "ffi" ) ) ]
681
+ let reason = ( ) ;
682
+ #[ cfg( feature = "ffi" ) ]
683
+ let reason = {
684
+ let reason = res. reason . unwrap ( ) ;
685
+ // Only save the reason phrase if it isnt the canonical reason
686
+ if Some ( reason) != status. canonical_reason ( ) {
687
+ Some ( Bytes :: copy_from_slice ( reason. as_bytes ( ) ) )
688
+ } else {
689
+ None
690
+ }
691
+ } ;
692
+
677
693
let version = if res. version . unwrap ( ) == 1 {
678
694
Version :: HTTP_11
679
695
} else {
680
696
Version :: HTTP_10
681
697
} ;
682
698
record_header_indices ( bytes, & res. headers , & mut headers_indices) ?;
683
699
let headers_len = res. headers . len ( ) ;
684
- ( len, status, version, headers_len)
700
+ ( len, status, reason , version, headers_len)
685
701
}
686
702
httparse:: Status :: Partial => return Ok ( None ) ,
687
703
}
@@ -728,6 +744,13 @@ impl Http1Transaction for Client {
728
744
extensions. insert ( header_case_map) ;
729
745
}
730
746
747
+ #[ cfg( feature = "ffi" ) ]
748
+ if let Some ( reason) = reason {
749
+ extensions. insert ( crate :: ffi:: ReasonPhrase ( reason) ) ;
750
+ }
751
+ #[ cfg( not( feature = "ffi" ) ) ]
752
+ drop ( reason) ;
753
+
731
754
let head = MessageHead {
732
755
version,
733
756
subject : status,
0 commit comments