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