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 |