Protocol::HTTPSourceProtocolHTTPAcceptEncoding

class AcceptEncoding

A middleware that sets the accept-encoding header and decodes the response according to the content-encoding header.

Definitions

ACCEPT_ENCODING = "accept-encoding".freeze

The header used to request encodings.

CONTENT_ENCODING = "content-encoding".freeze

The header used to specify encodings.

DEFAULT_WRAPPERS = {...}

The default wrappers to use for decoding content.

Implementation

DEFAULT_WRAPPERS = {
	"gzip" => Body::Inflate.method(:for),
	
	# There is no point including this:
	# 'identity' => ->(body){body},
}

def initialize(delegate, wrappers = DEFAULT_WRAPPERS)

Initialize the middleware with the given delegate and wrappers.

Signature

parameter delegate Protocol::HTTP::Middleware

The delegate middleware.

parameter wrappers Hash

A hash of encoding names to wrapper functions.

Implementation

def initialize(delegate, wrappers = DEFAULT_WRAPPERS)
	super(delegate)
	
	@accept_encoding = wrappers.keys.join(", ")
	@wrappers = wrappers
end

def call(request)

Set the accept-encoding header and decode the response body.

Signature

parameter request Protocol::HTTP::Request

The request to modify.

returns Protocol::HTTP::Response

The response.

Implementation

def call(request)
	request.headers[ACCEPT_ENCODING] = @accept_encoding
	
	response = super
	
	if body = response.body and !body.empty? and content_encoding = response.headers.delete(CONTENT_ENCODING)
		# We want to unwrap all encodings
		content_encoding.reverse_each do |name|
			if wrapper = @wrappers[name]
				body = wrapper.call(body)
			end
		end
		
		response.body = body
	end
	
	return response
end