Class: VCR::Response

Inherits:
Struct
  • Object
show all
Includes:
Normalizers::Body, Normalizers::Header
Defined in:
lib/vcr/structs.rb

Overview

The response of an HTTPInteraction.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Normalizers::Body

included

Constructor Details

#initialize(*args) ⇒ Response

Returns a new instance of Response.



338
339
340
341
# File 'lib/vcr/structs.rb', line 338

def initialize(*args)
  super(*args)
  self. ||= {}
end

Instance Attribute Details

#adapter_metadataHash

Additional metadata used by a specific VCR adapter.

Returns:

  • (Hash)

    the current value of adapter_metadata



334
335
336
# File 'lib/vcr/structs.rb', line 334

def 
  @adapter_metadata
end

#bodyString

the response body

Returns:

  • (String)

    the current value of body



334
335
336
# File 'lib/vcr/structs.rb', line 334

def body
  @body
end

#headersHash{String => Array<String>}

the response headers

Returns:

  • (Hash{String => Array<String>})

    the current value of headers



334
335
336
# File 'lib/vcr/structs.rb', line 334

def headers
  @headers
end

#http_versionnil, String

the HTTP version

Returns:

  • (nil, String)

    the current value of http_version



334
335
336
# File 'lib/vcr/structs.rb', line 334

def http_version
  @http_version
end

#statusResponseStatus

the status of the response

Returns:



334
335
336
# File 'lib/vcr/structs.rb', line 334

def status
  @status
end

Class Method Details

.decompress(body, type) ⇒ Object

Decode string compressed with gzip or deflate

Raises:



452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
# File 'lib/vcr/structs.rb', line 452

def self.decompress(body, type)
  unless HAVE_ZLIB
    warn "VCR: cannot decompress response; Zlib not available"
    return
  end

  case type
  when 'gzip'
    gzip_reader_options = {}
    gzip_reader_options[:encoding] = 'ASCII-8BIT' if ''.respond_to?(:encoding)
    yield Zlib::GzipReader.new(StringIO.new(body),
                               **gzip_reader_options).read
  when 'deflate'
    yield Zlib::Inflate.inflate(body)
  when 'identity', NilClass
    return
  else
    raise Errors::UnknownContentEncodingError, "unknown content encoding: #{type}"
  end
end

.from_hash(hash) ⇒ Response

Constructs a new instance from a hash.

Parameters:

  • hash (Hash)

    the hash to use to construct the instance.

Returns:



363
364
365
366
367
368
369
# File 'lib/vcr/structs.rb', line 363

def self.from_hash(hash)
  new ResponseStatus.from_hash(hash.fetch('status', {})),
      hash['headers'],
      body_from(hash['body']),
      hash['http_version'],
      hash['adapter_metadata']
end

Instance Method Details

#compressed?Boolean

Checks if the type of encoding is one of “gzip” or “deflate”.

Returns:

  • (Boolean)


385
386
387
# File 'lib/vcr/structs.rb', line 385

def compressed?
  %w[ gzip deflate ].include? content_encoding
end

#content_encodingString

The type of encoding.

Returns:

  • (String)

    encoding type



380
381
382
# File 'lib/vcr/structs.rb', line 380

def content_encoding
  enc = get_header('Content-Encoding') and enc.first
end

#decompressObject

Decodes the compressed body and deletes evidence that it was ever compressed.

Returns:

  • self

Raises:



399
400
401
402
403
404
405
406
407
# File 'lib/vcr/structs.rb', line 399

def decompress
  self.class.decompress(body, content_encoding) { |new_body|
    self.body = new_body
    update_content_length_header
    ['vcr_decompressed'] = content_encoding
    delete_header('Content-Encoding')
  }
  return self
end

#recompressObject

Recompresses the decompressed body according to adapter metadata.

Raises:



413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
# File 'lib/vcr/structs.rb', line 413

def recompress
  type = ['vcr_decompressed']
  new_body = begin
    case type
    when 'gzip'
      body_str = ''
      args = [StringIO.new(body_str)]
      args << { :encoding => 'ASCII-8BIT' } if ''.respond_to?(:encoding)
      writer = Zlib::GzipWriter.new(*args)
      writer.write(body)
      writer.close
      body_str
    when 'deflate'
      Zlib::Deflate.inflate(body)
    when 'identity', NilClass
      nil
    else
      raise Errors::UnknownContentEncodingError, "unknown content encoding: #{type}"
    end
  end
  if new_body
    self.body = new_body
    update_content_length_header
    headers['Content-Encoding'] = type
  end
end

#to_hashHash

Builds a serializable hash from the response data.

Returns:

  • (Hash)

    hash that represents this response and can be easily serialized.

See Also:



348
349
350
351
352
353
354
355
356
357
# File 'lib/vcr/structs.rb', line 348

def to_hash
  {
    'status'       => status.to_hash,
    'headers'      => headers,
    'body'         => serializable_body
  }.tap do |hash|
    hash['http_version']     = http_version if http_version
    hash['adapter_metadata'] =  unless .empty?
  end
end

#update_content_length_headerObject

Updates the Content-Length response header so that it is accurate for the response body.



373
374
375
# File 'lib/vcr/structs.rb', line 373

def update_content_length_header
  edit_header('Content-Length') { body ? body.bytesize.to_s : '0' }
end

#vcr_decompressed?Boolean

Checks if VCR decompressed the response body

Returns:

  • (Boolean)


390
391
392
# File 'lib/vcr/structs.rb', line 390

def vcr_decompressed?
  ['vcr_decompressed']
end