1 # frozen_string_literal: true
4 class CompressedRequests
9 def method_handled?(env)
10 %w[POST PUT].include? env["REQUEST_METHOD"]
13 def encoding_handled?(env)
14 %w[gzip deflate].include? env["HTTP_CONTENT_ENCODING"]
18 if method_handled?(env) && encoding_handled?(env)
19 extracted = decode(env[::Rack::RACK_INPUT], env["HTTP_CONTENT_ENCODING"])
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)
30 if env["HTTP_CONTENT_ENCODING"]
37 def decode(input, content_encoding)
41 when "gzip" then Zlib::GzipReader.new(input).read
42 when "deflate" then Zlib::Inflate.inflate(input.read)
48 Rails.configuration.middleware.use OpenStreetMap::CompressedRequests