--- /dev/null
+module OpenStreetMap
+ class CompressedRequests
+ def initialize(app)
+ @app = app
+ end
+
+ def method_handled?(env)
+ %w[POST PUT].include? env["REQUEST_METHOD"]
+ end
+
+ def encoding_handled?(env)
+ %w[gzip deflate].include? env["HTTP_CONTENT_ENCODING"]
+ end
+
+ def call(env)
+ if method_handled?(env) && encoding_handled?(env)
+ extracted = decode(env["rack.input"], env["HTTP_CONTENT_ENCODING"])
+
+ env.delete("HTTP_CONTENT_ENCODING")
+ env["CONTENT_LENGTH"] = extracted.bytesize
+ env["rack.input"] = StringIO.new(extracted)
+ end
+
+ if env["HTTP_CONTENT_ENCODING"]
+ [415, {}, []]
+ else
+ @app.call(env)
+ end
+ end
+
+ def decode(input, content_encoding)
+ input.rewind
+
+ case content_encoding
+ when "gzip" then Zlib::GzipReader.new(input).read
+ when "deflate" then Zlib::Inflate.inflate(input.read)
+ end
+ end
+ end
+end
+
+Rails.configuration.middleware.use OpenStreetMap::CompressedRequests