Module: VCR::Net::HTTPResponse

Defined in:
lib/vcr/extensions/net_http_response.rb

Overview

A Net::HTTP response that has already been read raises an IOError when #read_body is called with a destination string or block.

This causes a problem when VCR records a response–it reads the body before yielding the response, and if the code that is consuming the HTTP requests uses #read_body, it can cause an error.

This is a bit of a hack, but it allows a Net::HTTP response to be “re-read” after it has aleady been read. This attemps to preserve the behavior of #read_body, acting just as if it had never been read.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(response) ⇒ Object



16
17
18
# File 'lib/vcr/extensions/net_http_response.rb', line 16

def self.extended(response)
  response.instance_variable_set(:@__read_body_previously_called, false)
end

Instance Method Details

#read_body(dest = nil, &block) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/vcr/extensions/net_http_response.rb', line 20

def read_body(dest = nil, &block)
  return super if @__read_body_previously_called
  return @body if dest.nil? && block.nil?
  raise ArgumentError.new("both arg and block given for HTTP method") if dest && block

  if @body
    dest ||= ::Net::ReadAdapter.new(block)
    dest << @body
    @body = dest
  end
ensure
  # allow subsequent calls to #read_body to proceed as normal, without our hack...
  @__read_body_previously_called = true
end