Sha256: 4f7c4a1e408430b94e1330e4a4c088c4f37f7cb109d083069963932b9ce85768

Contents?: true

Size: 1.67 KB

Versions: 328

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

require 'faraday'

module SplitIoClient
  module FaradayMiddleware
    class Gzip < Faraday::Middleware
      ACCEPT_ENCODING = 'Accept-Encoding'
      CONTENT_ENCODING = 'Content-Encoding'
      CONTENT_LENGTH = 'Content-Length'
      SUPPORTED_ENCODINGS = 'gzip,deflate'
      RUBY_ENCODING = '1.9'.respond_to?(:force_encoding)

      def call(env)
        env[:request_headers][ACCEPT_ENCODING] ||= SUPPORTED_ENCODINGS
        @app.call(env).on_complete do |response_env|
          case response_env[:response_headers][CONTENT_ENCODING]
          when 'gzip'
            reset_body(response_env, &method(:uncompress_gzip))
          when 'deflate'
            reset_body(response_env, &method(:inflate))
          end
        end
      end

      def reset_body(env)
        env[:body] = yield(env[:body])
        env[:response_headers].delete(CONTENT_ENCODING)
        env[:response_headers][CONTENT_LENGTH] = env[:body].length
      end

      def uncompress_gzip(body)
        io = StringIO.new(body)
        gzip_reader = if RUBY_ENCODING
                        Zlib::GzipReader.new(io, encoding: 'ASCII-8BIT')
                      else
                        Zlib::GzipReader.new(io)
                      end
        gzip_reader.read
      end

      def inflate(body)
        # Inflate as a DEFLATE (RFC 1950+RFC 1951) stream
        Zlib::Inflate.inflate(body)
      rescue Zlib::DataError
        # Fall back to inflating as a "raw" deflate stream which
        # Microsoft servers return
        inflate = Zlib::Inflate.new(-Zlib::MAX_WBITS)
        begin
          inflate.inflate(body)
        ensure
          inflate.close
        end
      end
    end
  end
end

Version data entries

328 entries across 328 versions & 1 rubygems

Version Path
splitclient-rb-8.5.0-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.5.0 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.5.0.pre.rc1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.5.0.pre.rc1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.1.pre.rc1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.1.pre.rc1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0.pre.rc1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0.pre.rc1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0.rc.1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.4.0.rc.1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.2.pre.rc2-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.2.pre.rc2 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.2.pre.rc1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.2.pre.rc1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.1.pre.rc1-java lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb
splitclient-rb-8.3.1.pre.rc1 lib/splitclient-rb/engine/api/faraday_middleware/gzip.rb