Skip to content

Commit a2d8e5d

Browse files
committed
did some cleanup!
1 parent 8b0b4ce commit a2d8e5d

File tree

3 files changed

+26
-37
lines changed

3 files changed

+26
-37
lines changed

src/ext.rs

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use http::header::HeaderName;
55
#[cfg(feature = "http1")]
66
use http::header::{IntoHeaderName, ValueIter};
77
use http::HeaderMap;
8+
use std::collections::{HashSet, HashMap};
89
#[cfg(feature = "http2")]
910
use std::fmt;
1011

@@ -123,52 +124,40 @@ impl HeaderCaseMap {
123124
}
124125

125126
#[derive(Clone, Debug)]
126-
pub(crate) struct OriginalHeaderMap(HeaderMap<Bytes>, Vec<(HeaderName, usize)>);
127+
/// Hashmap<Headername, numheaders with that name>
128+
pub(crate) struct OriginalHeaderOrder(HashMap<HeaderName, usize>, Vec<(HeaderName, usize)>);
127129

128130
#[cfg(feature = "http1")]
129-
impl OriginalHeaderMap {
130-
/// Returns a view of all spellings associated with that header name,
131-
/// in the order they were found.
132-
pub(crate) fn get_all<'a>(
133-
&'a self,
134-
name: &HeaderName,
135-
) -> impl Iterator<Item = impl AsRef<[u8]> + 'a> + 'a {
136-
self.get_all_internal(name).into_iter()
137-
}
138-
139-
/// Returns a view of all spellings associated with that header name,
140-
/// in the order they were found.
141-
pub(crate) fn get_all_internal<'a>(&'a self, name: &HeaderName) -> ValueIter<'_, Bytes> {
142-
self.0.get_all(name).into_iter()
143-
}
144-
131+
impl OriginalHeaderOrder {
145132
pub(crate) fn default() -> Self {
146133
Self(Default::default(), Default::default())
147134
}
148135

149136
#[cfg(any(test, feature = "ffi"))]
150137
pub(crate) fn insert(&mut self, name: HeaderName, orig: Bytes) {
151-
if let Some(_) = self.0.insert(&name, orig) {
152-
for i in 0..self.1.len() {
153-
if self.1[i].0 == name {
154-
let idx = self.1[i].1;
155-
self.1[i] = (name, idx);
156-
return;
157-
}
158-
}
159-
} else {
160-
let idx = self.0.get_all(&name).iter().count();
138+
if !self.0.contains_key(&name) {
139+
let idx = 0;
140+
self.0.insert(name.clone(), 1);
161141
self.1.push((name, idx));
162142
}
143+
// replacing an already existing element does not
144+
// change ordering, so we only care if its the first
145+
// header name encountered
163146
}
164147

165148
pub(crate) fn append<N>(&mut self, name: N, orig: Bytes)
166149
where
167150
N: IntoHeaderName + Into<HeaderName> + Clone,
168151
{
169152
let name: HeaderName = name.into();
170-
let idx = self.0.get_all(&name).iter().count();
171-
self.0.append(&name, orig);
153+
let idx;
154+
if self.0.contains_key(&name) {
155+
idx = self.0[&name];
156+
*self.0.get_mut(&name).unwrap() += 1;
157+
} else {
158+
idx = 0;
159+
self.0.insert(name.clone(), 1);
160+
}
172161
self.1.push((name, idx));
173162
}
174163

src/ffi/http_types.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use super::body::{hyper_body, hyper_buf};
66
use super::error::hyper_code;
77
use super::task::{hyper_task_return_type, AsTaskType};
88
use super::{UserDataPointer, HYPER_ITER_CONTINUE};
9-
use crate::ext::{HeaderCaseMap, OriginalHeaderMap};
9+
use crate::ext::{HeaderCaseMap, OriginalHeaderOrder};
1010
use crate::header::{HeaderName, HeaderValue};
1111
use crate::{Body, HeaderMap, Method, Request, Response, Uri};
1212

@@ -22,7 +22,7 @@ pub struct hyper_response(pub(super) Response<Body>);
2222
pub struct hyper_headers {
2323
pub(super) headers: HeaderMap,
2424
orig_casing: HeaderCaseMap,
25-
orig_order: OriginalHeaderMap,
25+
orig_order: OriginalHeaderOrder,
2626
}
2727

2828
#[derive(Debug)]
@@ -352,8 +352,8 @@ impl hyper_response {
352352
.unwrap_or_else(HeaderCaseMap::default);
353353
let orig_order = resp
354354
.extensions_mut()
355-
.remove::<OriginalHeaderMap>()
356-
.unwrap_or_else(OriginalHeaderMap::default);
355+
.remove::<OriginalHeaderOrder>()
356+
.unwrap_or_else(OriginalHeaderOrder::default);
357357
resp.extensions_mut().insert(hyper_headers {
358358
headers,
359359
orig_casing,
@@ -503,7 +503,7 @@ impl Default for hyper_headers {
503503
Self {
504504
headers: Default::default(),
505505
orig_casing: HeaderCaseMap::default(),
506-
orig_order: OriginalHeaderMap::default(),
506+
orig_order: OriginalHeaderOrder::default(),
507507
}
508508
}
509509
}

src/proto/h1/role.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::body::DecodedLength;
1414
#[cfg(feature = "server")]
1515
use crate::common::date;
1616
use crate::error::Parse;
17-
use crate::ext::{HeaderCaseMap, OriginalHeaderMap};
17+
use crate::ext::{HeaderCaseMap, OriginalHeaderOrder};
1818
use crate::headers;
1919
use crate::proto::h1::{
2020
Encode, Encoder, Http1Transaction, ParseContext, ParseResult, ParsedMessage,
@@ -213,7 +213,7 @@ impl Http1Transaction for Server {
213213
};
214214

215215
let mut header_order = if ctx.preserve_header_order {
216-
Some(OriginalHeaderMap::default())
216+
Some(OriginalHeaderOrder::default())
217217
} else {
218218
None
219219
};
@@ -997,7 +997,7 @@ impl Http1Transaction for Client {
997997
};
998998

999999
let mut header_order = if ctx.preserve_header_order {
1000-
Some(OriginalHeaderMap::default())
1000+
Some(OriginalHeaderOrder::default())
10011001
} else {
10021002
None
10031003
};

0 commit comments

Comments
 (0)