@@ -71,6 +71,15 @@ handle(
71
71
RewriteResult
72
72
end ,
73
73
lager :debug (" ~p Fetching ~s " , [self (), Url ]),
74
+ AcceptGzip = lists :any (
75
+ fun (X ) -> X == " gzip" end ,
76
+ string :tokens (
77
+ lists :filter (
78
+ fun (X ) -> X =/= 16#20 end ,
79
+ binary_to_list (proplists :lookup (<<" accept-encoding" >>))
80
+ ), " ,"
81
+ )
82
+ ),
74
83
ModifiedHeaders = modify_req_headers (Headers , ThisNode ),
75
84
{ibrowse_req_id , _RequestId } = ibrowse :send_req (
76
85
binary_to_list (Url ),
@@ -81,7 +90,7 @@ handle(
81
90
infinity
82
91
),
83
92
84
- FinalReq = receive_loop (State , Req , State # state .default_callbacks ),
93
+ FinalReq = receive_loop (State , Req , State # state .default_callbacks , AcceptGzip ),
85
94
lager :debug (" ~p Done" , [self ()]),
86
95
{ok , FinalReq , State }.
87
96
@@ -139,30 +148,36 @@ init_default_callbacks() ->
139
148
end .
140
149
141
150
receive_loop (
142
- State , Req ,
151
+ # state { enable_gzip = EnableGzip } = State ,
152
+ Req ,
143
153
# callbacks {
144
154
processor = Processor ,
145
155
finalizer = Finalizer ,
146
156
stream_next = StreamNext ,
147
157
stream_close = StreamClose
148
- } = Callbacks ) ->
158
+ } = Callbacks ,
159
+ AcceptGzip ) ->
149
160
receive
150
161
{ ibrowse_async_headers , RequestId , Code , IBrowseHeaders } ->
151
162
ok = StreamNext (RequestId ),
152
163
Headers = headers_ibrowse_to_cowboy (IBrowseHeaders ),
153
164
ModifiedHeaders = modify_res_headers (Headers ),
154
165
155
166
{ NewHeaders , NewCallbacks } =
156
- optional_add_gzip_compression (
157
- State , ModifiedHeaders , Callbacks
158
- ),
159
-
167
+ case EnableGzip and AcceptGzip of
168
+ true ->
169
+ optional_add_gzip_compression (
170
+ ModifiedHeaders , Callbacks
171
+ );
172
+ false ->
173
+ { ModifiedHeaders , Callbacks }
174
+ end ,
160
175
{ ok , NewReq } = send_headers (Req , Code , NewHeaders ),
161
- receive_loop (State , NewReq , NewCallbacks );
176
+ receive_loop (State , NewReq , NewCallbacks , AcceptGzip );
162
177
{ ibrowse_async_response , RequestId , Data } ->
163
178
ok = StreamNext (RequestId ),
164
179
ok = send_chunk (Req , Processor (Data )),
165
- receive_loop (State , Req , Callbacks );
180
+ receive_loop (State , Req , Callbacks , AcceptGzip );
166
181
167
182
{ ibrowse_async_response_end , RequestId } ->
168
183
ok = StreamClose (RequestId ),
@@ -188,13 +203,10 @@ apply_rewrite_rules(Url, [{CompiledRe,ReplaceString}|OtherRules]) ->
188
203
false -> apply_rewrite_rules (Url , OtherRules )
189
204
end .
190
205
191
- -spec optional_add_gzip_compression (
192
- # state {}, headers (), # callbacks {}) ->
193
- { headers (), # callbacks {} }.
194
- optional_add_gzip_compression (
195
- # state { enable_gzip = EnableGzip }, Headers , Callbacks ) ->
196
- case { EnableGzip , proplists :get_value (<<" content-encoding" >>, Headers ) } of
197
- { true , undefined } ->
206
+ -spec optional_add_gzip_compression (headers (), # callbacks {}) -> { headers (), # callbacks {} }.
207
+ optional_add_gzip_compression (Headers , Callbacks ) ->
208
+ case proplists :get_value (<<" content-encoding" >>, Headers ) of
209
+ undefined ->
198
210
lager :debug (" ~p Using gzip compression" , [self ()]),
199
211
ZlibStream = zlib :open (),
200
212
ok = zlib :deflateInit (ZlibStream , default , deflated , 16 + ? MAX_WBITS , 8 , default ),
0 commit comments