Skip to content

Commit 9821660

Browse files
committed
feat: restore header case-insensitivity
1 parent 7531c58 commit 9821660

File tree

2 files changed

+27
-32
lines changed

2 files changed

+27
-32
lines changed

crates/lang_handler/src/headers.rs

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::{hash_map::Entry, HashMap};
22

33
/// Represents a single HTTP header value or multiple values for the same header.
4-
#[derive(Debug, Clone)]
4+
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
55
pub enum Header {
66
/// A single value for a header.
77
Single(String),
@@ -62,9 +62,7 @@ impl Headers {
6262
where
6363
K: AsRef<str>,
6464
{
65-
self
66-
.0
67-
.contains_key(key.as_ref() /*.to_lowercase().as_str()*/)
65+
self.0.contains_key(key.as_ref().to_lowercase().as_str())
6866
}
6967

7068
/// Returns the last single value associated with a header field.
@@ -83,7 +81,7 @@ impl Headers {
8381
where
8482
K: AsRef<str>,
8583
{
86-
match self.0.get(key.as_ref() /*.to_lowercase().as_str()*/) {
84+
match self.0.get(key.as_ref().to_lowercase().as_str()) {
8785
Some(Header::Single(value)) => Some(value.clone()),
8886
Some(Header::Multiple(values)) => values.last().cloned(),
8987
None => None,
@@ -112,7 +110,7 @@ impl Headers {
112110
where
113111
K: AsRef<str>,
114112
{
115-
match self.0.get(key.as_ref() /*.to_lowercase().as_str()*/) {
113+
match self.0.get(key.as_ref().to_lowercase().as_str()) {
116114
Some(Header::Single(value)) => vec![value.clone()],
117115
Some(Header::Multiple(values)) => values.clone(),
118116
None => Vec::new(),
@@ -143,12 +141,10 @@ impl Headers {
143141
where
144142
K: AsRef<str>,
145143
{
146-
let result = self.get_all(key).join(",");
147-
if result.is_empty() {
148-
None
149-
} else {
150-
Some(result)
151-
}
144+
self
145+
.0
146+
.get(key.as_ref().to_lowercase().as_str())
147+
.map(|v| v.into())
152148
}
153149

154150
/// Sets a header field, replacing any existing values.
@@ -168,10 +164,9 @@ impl Headers {
168164
K: Into<String>,
169165
V: Into<String>,
170166
{
171-
self.0.insert(
172-
key.into(), /*.to_lowercase()*/
173-
Header::Single(value.into()),
174-
);
167+
self
168+
.0
169+
.insert(key.into().to_lowercase(), Header::Single(value.into()));
175170
}
176171

177172
/// Add a header with the given value without replacing existing ones.
@@ -194,7 +189,7 @@ impl Headers {
194189
K: Into<String>,
195190
V: Into<String>,
196191
{
197-
let key = key.into()/*.to_lowercase()*/;
192+
let key = key.into().to_lowercase();
198193
let value = value.into();
199194

200195
match self.0.entry(key) {
@@ -234,7 +229,7 @@ impl Headers {
234229
where
235230
K: AsRef<str>,
236231
{
237-
self.0.remove(key.as_ref() /*.to_lowercase().as_str()*/);
232+
self.0.remove(key.as_ref().to_lowercase().as_str());
238233
}
239234

240235
/// Clears all headers.
@@ -292,14 +287,21 @@ impl Headers {
292287
/// # Examples
293288
///
294289
/// ```
295-
/// # use lang_handler::Headers;
290+
/// # use lang_handler::{Headers, Header};
296291
/// let mut headers = Headers::new();
297-
/// headers.set("Accept", "text/plain");
298-
/// headers.set("Accept", "application/json");
292+
/// headers.add("Accept", "text/plain");
293+
/// headers.add("Accept", "application/json");
299294
///
300295
/// for (key, values) in headers.iter() {
301296
/// println!("{}: {:?}", key, values);
302297
/// }
298+
///
299+
/// # assert_eq!(headers.iter().collect::<Vec<(&String, &Header)>>(), vec![
300+
/// # (&"accept".to_string(), &Header::Multiple(vec![
301+
/// # "text/plain".to_string(),
302+
/// # "application/json".to_string()
303+
/// # ]))
304+
/// # ]);
303305
/// ```
304306
pub fn iter(&self) -> impl Iterator<Item = (&String, &Header)> {
305307
self.0.iter()

crates/php/src/sapi.rs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ use crate::{
2626
strings::{cstr, drop_str, reclaim_str},
2727
EmbedRequestError, EmbedStartError, RequestContext,
2828
};
29-
use lang_handler::Header;
3029

3130
// This is a helper to ensure that PHP is initialized and deinitialized at the
3231
// appropriate times.
@@ -384,16 +383,10 @@ pub extern "C" fn sapi_module_register_server_variables(vars: *mut ext_php_rs::t
384383
Ok::<(), EmbedRequestError>(())
385384
.and_then(|_| {
386385
for (key, values) in headers.iter() {
387-
let maybe_header = match values {
388-
Header::Single(header) => Some(header),
389-
Header::Multiple(headers) => headers.first(),
390-
};
391-
392-
if let Some(header) = maybe_header {
393-
let upper = key.to_ascii_uppercase();
394-
let cgi_key = format!("HTTP_{}", upper.replace("-", "_"));
395-
env_var(vars, cgi_key, header)?;
396-
}
386+
let value_string: String = values.into();
387+
let upper = key.to_ascii_uppercase();
388+
let cgi_key = format!("HTTP_{}", upper.replace("-", "_"));
389+
env_var(vars, cgi_key, value_string)?;
397390
}
398391

399392
let globals = SapiGlobals::get();

0 commit comments

Comments
 (0)