]> git.openstreetmap.org Git - rails.git/blobdiff - config/initializers/compressed_requests.rb
Merge branch 'master' into HEAD
[rails.git] / config / initializers / compressed_requests.rb
diff --git a/config/initializers/compressed_requests.rb b/config/initializers/compressed_requests.rb
new file mode 100644 (file)
index 0000000..c6a84a1
--- /dev/null
@@ -0,0 +1,42 @@
+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