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