@@ -5,6 +5,7 @@ use http::header::HeaderName;
55#[ cfg( feature = "http1" ) ]
66use http:: header:: { IntoHeaderName , ValueIter } ;
77use http:: HeaderMap ;
8+ use std:: collections:: { HashSet , HashMap } ;
89#[ cfg( feature = "http2" ) ]
910use 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
0 commit comments