@@ -110,14 +110,22 @@ where
110
110
111
111
#[ allow( clippy:: borrow_interior_mutable_const) ]
112
112
fn call ( & self , req : ServiceRequest ) -> Self :: Future {
113
+ if req. extensions ( ) . get :: < Encoding > ( ) . is_some ( ) {
114
+ return Either :: left ( CompressResponse {
115
+ fut : self . service . call ( req) ,
116
+ _phantom : PhantomData ,
117
+ } ) ;
118
+ }
119
+
113
120
// negotiate content-encoding
114
121
let accept_encoding = req. get_header :: < AcceptEncoding > ( ) ;
115
122
116
123
let accept_encoding = match accept_encoding {
117
124
// missing header; fallback to identity
118
125
None => {
126
+ req. extensions_mut ( ) . insert :: < Encoding > ( Encoding :: identity ( ) ) ;
127
+
119
128
return Either :: left ( CompressResponse {
120
- encoding : Encoding :: identity ( ) ,
121
129
fut : self . service . call ( req) ,
122
130
_phantom : PhantomData ,
123
131
} )
@@ -143,11 +151,14 @@ where
143
151
. map_into_right_body ( ) ) )
144
152
}
145
153
146
- Some ( encoding) => Either :: left ( CompressResponse {
147
- fut : self . service . call ( req) ,
148
- encoding,
149
- _phantom : PhantomData ,
150
- } ) ,
154
+ Some ( encoding) => {
155
+ req. extensions_mut ( ) . insert :: < Encoding > ( encoding) ;
156
+
157
+ Either :: left ( CompressResponse {
158
+ fut : self . service . call ( req) ,
159
+ _phantom : PhantomData ,
160
+ } )
161
+ } ,
151
162
}
152
163
}
153
164
}
@@ -159,7 +170,6 @@ pin_project! {
159
170
{
160
171
#[ pin]
161
172
fut: S :: Future ,
162
- encoding: Encoding ,
163
173
_phantom: PhantomData <B >,
164
174
}
165
175
}
@@ -176,8 +186,19 @@ where
176
186
177
187
match ready ! ( this. fut. poll( cx) ) {
178
188
Ok ( resp) => {
179
- let enc = match this. encoding {
180
- Encoding :: Known ( enc) => * enc,
189
+ let request_encoding = resp. request ( ) . extensions ( ) . get :: < Encoding > ( ) . cloned ( ) ;
190
+
191
+ let encoding = match request_encoding {
192
+ Some ( enc) => enc. clone ( ) ,
193
+ None => {
194
+ return Poll :: Ready ( Ok ( resp. map_body ( move |head, body| {
195
+ EitherBody :: left ( Encoder :: response ( ContentEncoding :: Identity , head, body) )
196
+ } ) ) ) ;
197
+ }
198
+ } ;
199
+
200
+ let enc = match encoding {
201
+ Encoding :: Known ( enc) => enc,
181
202
Encoding :: Unknown ( enc) => {
182
203
unimplemented ! ( "encoding '{enc}' should not be here" ) ;
183
204
}
0 commit comments