refactor(ffi): Add Reason-Phrase API
This adds an internal ability to copy the HTTP/1 reason-phrase and place it in the `http::Extensions` of a response, if it doesn't match the canonical reason. This could be exposed in the Rust API later, but for now it is only used by the C API.
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
use std::fmt::{self, Write};
|
||||
use std::mem;
|
||||
|
||||
#[cfg(feature = "ffi")]
|
||||
use bytes::Bytes;
|
||||
use bytes::BytesMut;
|
||||
use http::header::{self, Entry, HeaderName, HeaderValue};
|
||||
use http::{HeaderMap, Method, StatusCode, Version};
|
||||
@@ -660,7 +662,7 @@ impl Http1Transaction for Client {
|
||||
loop {
|
||||
// Unsafe: see comment in Server Http1Transaction, above.
|
||||
let mut headers_indices: [HeaderIndices; MAX_HEADERS] = unsafe { mem::uninitialized() };
|
||||
let (len, status, version, headers_len) = {
|
||||
let (len, status, reason, version, headers_len) = {
|
||||
let mut headers: [httparse::Header<'_>; MAX_HEADERS] =
|
||||
unsafe { mem::uninitialized() };
|
||||
trace!(
|
||||
@@ -674,6 +676,20 @@ impl Http1Transaction for Client {
|
||||
httparse::Status::Complete(len) => {
|
||||
trace!("Response.parse Complete({})", len);
|
||||
let status = StatusCode::from_u16(res.code.unwrap())?;
|
||||
|
||||
#[cfg(not(feature = "ffi"))]
|
||||
let reason = ();
|
||||
#[cfg(feature = "ffi")]
|
||||
let reason = {
|
||||
let reason = res.reason.unwrap();
|
||||
// Only save the reason phrase if it isnt the canonical reason
|
||||
if Some(reason) != status.canonical_reason() {
|
||||
Some(Bytes::copy_from_slice(reason.as_bytes()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
};
|
||||
|
||||
let version = if res.version.unwrap() == 1 {
|
||||
Version::HTTP_11
|
||||
} else {
|
||||
@@ -681,7 +697,7 @@ impl Http1Transaction for Client {
|
||||
};
|
||||
record_header_indices(bytes, &res.headers, &mut headers_indices)?;
|
||||
let headers_len = res.headers.len();
|
||||
(len, status, version, headers_len)
|
||||
(len, status, reason, version, headers_len)
|
||||
}
|
||||
httparse::Status::Partial => return Ok(None),
|
||||
}
|
||||
@@ -728,6 +744,13 @@ impl Http1Transaction for Client {
|
||||
extensions.insert(header_case_map);
|
||||
}
|
||||
|
||||
#[cfg(feature = "ffi")]
|
||||
if let Some(reason) = reason {
|
||||
extensions.insert(crate::ffi::ReasonPhrase(reason));
|
||||
}
|
||||
#[cfg(not(feature = "ffi"))]
|
||||
drop(reason);
|
||||
|
||||
let head = MessageHead {
|
||||
version,
|
||||
subject: status,
|
||||
|
||||
Reference in New Issue
Block a user