]> git.openstreetmap.org Git - rails.git/blob - config/initializers/compressed_requests.rb
Merge remote-tracking branch 'upstream/pull/6314'
[rails.git] / config / initializers / compressed_requests.rb
1 module OpenStreetMap
2   class CompressedRequests
3     def initialize(app)
4       @app = app
5     end
6
7     def method_handled?(env)
8       %w[POST PUT].include? env["REQUEST_METHOD"]
9     end
10
11     def encoding_handled?(env)
12       %w[gzip deflate].include? env["HTTP_CONTENT_ENCODING"]
13     end
14
15     def call(env)
16       if method_handled?(env) && encoding_handled?(env)
17         extracted = decode(env[::Rack::RACK_INPUT], env["HTTP_CONTENT_ENCODING"])
18
19         env.delete("HTTP_CONTENT_ENCODING")
20         env.delete(::Rack::RACK_REQUEST_FORM_ERROR)
21         env.delete(::Rack::RACK_REQUEST_FORM_HASH)
22         env.delete(::Rack::RACK_REQUEST_FORM_INPUT)
23         env.delete(::Rack::RACK_REQUEST_FORM_PAIRS)
24         env["CONTENT_LENGTH"] = extracted.bytesize
25         env[::Rack::RACK_INPUT] = StringIO.new(extracted)
26       end
27
28       if env["HTTP_CONTENT_ENCODING"]
29         [415, {}, []]
30       else
31         @app.call(env)
32       end
33     end
34
35     def decode(input, content_encoding)
36       input.rewind
37
38       case content_encoding
39       when "gzip" then Zlib::GzipReader.new(input).read
40       when "deflate" then Zlib::Inflate.inflate(input.read)
41       end
42     end
43   end
44 end
45
46 Rails.configuration.middleware.use OpenStreetMap::CompressedRequests