class Rack::Inflater

Constants

VERSION

Public Class Methods

new(app) click to toggle source
# File lib/rack/inflater.rb, line 7
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/inflater.rb, line 11
def call(env)
  if decompress?(env)
    character_set = env["rack.input".freeze].external_encoding
    extracted = decode(
      env["rack.input".freeze],
      env["HTTP_CONTENT_ENCODING".freeze]
    )

    env.delete("HTTP_CONTENT_ENCODING".freeze)
    env["CONTENT_LENGTH".freeze] = extracted.bytesize
    input = StringIO.new(extracted).set_encoding(character_set).set_encoding("UTF-8")
    env['rack.input'.freeze] = input
  end

  @app.call(env)
end

Private Instance Methods

decode(input, content_encoding) click to toggle source
# File lib/rack/inflater.rb, line 43
def decode(input, content_encoding)
  decompressed = "".force_encoding("ASCII-8BIT")
  decoder = HttpDecoders.decoder_for_encoding(content_encoding).new do |data|
    decompressed << data
  end
  decoder << input.read
  decoder.finalize!
  decompressed
end
decompress?(env) click to toggle source
# File lib/rack/inflater.rb, line 30
def decompress?(env)
  method_handled?(env["REQUEST_METHOD".freeze]) &&
    encoding_handled?(env["HTTP_CONTENT_ENCODING".freeze])
end
encoding_handled?(encoding) click to toggle source
# File lib/rack/inflater.rb, line 39
def encoding_handled?(encoding)
  HttpDecoders.accepted_encodings.include? encoding
end
method_handled?(method) click to toggle source
# File lib/rack/inflater.rb, line 35
def method_handled?(method)
  %w[POST PUT PATCH DELETE].include? method
end