Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Rack Middleware to automatically unzip gzipped/deflated POST data
class CompressedRequests
def initialize(app)
@app = app
end
def call(env)
if env['REQUEST_METHOD'] =~ /(POST|PUT)/
if env.keys.include? 'HTTP_CONTENT_ENCODING'
input = env['rack.input'].read
new_input = decode(input, env['HTTP_CONTENT_ENCODING'])
env['rack.input'] = StringIO.new(new_input)
env['CONTENT_LENGTH'] = new_input.length
env.delete('HTTP_CONTENT_ENCODING')
end
end
status, headers, response = @app.call(env)
return [status, headers, response]
end
def decode(input, content_encoding)
if content_encoding == 'gzip'
z = Zlib::GzipReader.new(StringIO.new(input)).read
elsif content_encoding == 'deflate'
Zlib::Inflate.new.inflate new input
else
input
end
end
end
@gotoAndBliss

This comment has been minimized.

Copy link

commented Mar 27, 2014

Out of curiosity, how do you instantiate CompressedRequests into the Rack? I'm trying to do the same, but my ['rack.input'] won't write.

@mestachs

This comment has been minimized.

Copy link

commented Jul 16, 2014

I suspect that the correct version, dealing better with utf-8 (chars vs bytes) :

   env['CONTENT_LENGTH'] = new_input.bytes.size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.