lib/restforce/middleware/gzip.rb



require 'zlib'

module Restforce
  # Middleware to uncompress GZIP compressed responses from Salesforce.
  class Middleware::Gzip < Restforce::Middleware
    ACCEPT_ENCODING_HEADER  = 'Accept-Encoding'.freeze
    CONTENT_ENCODING_HEADER = 'Content-Encoding'.freeze
    ENCODING                = 'gzip'.freeze

    def call(env)
      env[:request_headers][ACCEPT_ENCODING_HEADER] = ENCODING if @options[:compress]
      @app.call(env).on_complete do |environment|
        on_complete(environment)
      end
    end

    def on_complete(env)
      env[:body] = decompress(env[:body]) if gzipped?(env)
    end

    # Internal: Returns true if the response is gzipped.
    def gzipped?(env)
      env[:response_headers][CONTENT_ENCODING_HEADER] == ENCODING
    end

    # Internal: Decompresses a gzipped string.
    def decompress(body)
      Zlib::GzipReader.new(StringIO.new(body)).read
    end
  end
end