class Aws::Plugins::RequestCompression::CompressionHandler

@api private

Public Instance Methods

call(context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 83
def call(context)
  if should_compress?(context)
    selected_encoding = request_encoding_selection(context)
    if selected_encoding
      if streaming?(context.operation.input)
        process_streaming_compression(selected_encoding, context)
      elsif context.http_request.body.size >= context.config.request_min_compression_size_bytes
        process_compression(selected_encoding, context)
      end
    end
  end
  with_metric(selected_encoding) { @handler.call(context) }
end

Private Instance Methods

gzip_compress(context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 145
def gzip_compress(context)
  compressed = StringIO.new
  compressed.binmode
  gzip_writer = Zlib::GzipWriter.new(compressed)
  if context.http_request.body.respond_to?(:read)
    update_in_chunks(gzip_writer, context.http_request.body)
  else
    gzip_writer.write(context.http_request.body)
  end
  gzip_writer.close
  new_body = StringIO.new(compressed.string)
  context.http_request.body = new_body
end
process_compression(encoding, context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 135
def process_compression(encoding, context)
  case encoding
  when 'gzip'
    gzip_compress(context)
  else
    raise StandardError, "We currently do not support #{encoding} encoding"
  end
  update_content_encoding(encoding, context)
end
process_streaming_compression(encoding, context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 168
def process_streaming_compression(encoding, context)
  case encoding
  when 'gzip'
    context.http_request.body = GzipIO.new(context.http_request.body)
  else
    raise StandardError, "We currently do not support #{encoding} encoding"
  end
  update_content_encoding(encoding, context)
end
request_encoding_selection(context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 108
def request_encoding_selection(context)
  encoding_list = context.operation.request_compression['encodings']
  encoding_list.find { |encoding| RequestCompression::SUPPORTED_ENCODINGS.include?(encoding) }
end
should_compress?(context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 122
def should_compress?(context)
  context.operation.request_compression &&
    !context.config.disable_request_compression
end
streaming?(input) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 127
def streaming?(input)
  if payload = input[:payload_member] # checking ref and shape
    payload['streaming'] || payload.shape['streaming']
  else
    false
  end
end
update_content_encoding(encoding, context) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 113
def update_content_encoding(encoding, context)
  headers = context.http_request.headers
  if headers['Content-Encoding']
    headers['Content-Encoding'] += ", #{encoding}"
  else
    headers['Content-Encoding'] = encoding
  end
end
update_in_chunks(compressor, io) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 159
def update_in_chunks(compressor, io)
  loop do
    chunk = io.read(CHUNK_SIZE)
    break unless chunk

    compressor.write(chunk)
  end
end
with_metric(encoding, &block) click to toggle source
# File lib/aws-sdk-core/plugins/request_compression.rb, line 99
def with_metric(encoding, &block)
  case encoding
  when 'gzip'
    Aws::Plugins::UserAgent.metric('GZIP_REQUEST_COMPRESSION', &block)
  else
    block.call
  end
end