vcr 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/CHANGELOG.md +34 -0
  2. data/README.md +89 -21
  3. data/lib/vcr.rb +12 -1
  4. data/lib/vcr/cassette.rb +50 -27
  5. data/lib/vcr/config.rb +9 -0
  6. data/lib/vcr/deprecations.rb +15 -42
  7. data/lib/vcr/extensions/net_http.rb +13 -20
  8. data/lib/vcr/extensions/net_http_response.rb +6 -13
  9. data/lib/vcr/http_stubbing_adapters/fakeweb.rb +21 -3
  10. data/lib/vcr/http_stubbing_adapters/webmock.rb +34 -4
  11. data/lib/vcr/version.rb +16 -0
  12. metadata +90 -108
  13. data/.document +0 -5
  14. data/.gitignore +0 -22
  15. data/Rakefile +0 -67
  16. data/VERSION +0 -1
  17. data/benchmarks/http_stubbing_libraries.rb +0 -59
  18. data/features/fixtures/vcr_cassettes/1.8.6/cucumber_tags/replay_cassette1.yml +0 -43
  19. data/features/fixtures/vcr_cassettes/1.8.6/cucumber_tags/replay_cassette2.yml +0 -47
  20. data/features/fixtures/vcr_cassettes/1.8.6/cucumber_tags/replay_cassette3.yml +0 -85
  21. data/features/fixtures/vcr_cassettes/1.8.6/nested_replay_cassette.yml +0 -24
  22. data/features/fixtures/vcr_cassettes/1.8.6/not_the_real_response.yml +0 -43
  23. data/features/fixtures/vcr_cassettes/1.8.7/cucumber_tags/replay_cassette1.yml +0 -43
  24. data/features/fixtures/vcr_cassettes/1.8.7/cucumber_tags/replay_cassette2.yml +0 -47
  25. data/features/fixtures/vcr_cassettes/1.8.7/cucumber_tags/replay_cassette3.yml +0 -85
  26. data/features/fixtures/vcr_cassettes/1.8.7/nested_replay_cassette.yml +0 -24
  27. data/features/fixtures/vcr_cassettes/1.8.7/not_the_real_response.yml +0 -43
  28. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette1.yml +0 -43
  29. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette2.yml +0 -63
  30. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette3.yml +0 -85
  31. data/features/fixtures/vcr_cassettes/1.9.1/nested_replay_cassette.yml +0 -32
  32. data/features/fixtures/vcr_cassettes/1.9.1/not_the_real_response.yml +0 -43
  33. data/features/record_response.feature +0 -77
  34. data/features/replay_recorded_response.feature +0 -69
  35. data/features/step_definitions/vcr_steps.rb +0 -144
  36. data/features/support/env.rb +0 -64
  37. data/lib/vcr/extensions/fake_web.rb +0 -20
  38. data/lib/vcr/extensions/net_read_adapter.rb +0 -22
  39. data/spec/cassette_spec.rb +0 -213
  40. data/spec/config_spec.rb +0 -49
  41. data/spec/cucumber_tags_spec.rb +0 -71
  42. data/spec/deprecations_spec.rb +0 -67
  43. data/spec/extensions/net_http_response_spec.rb +0 -86
  44. data/spec/extensions/net_http_spec.rb +0 -72
  45. data/spec/extensions/net_read_adapter_spec.rb +0 -10
  46. data/spec/fixtures/1.8.6/0_3_1_cassette.yml +0 -29
  47. data/spec/fixtures/1.8.6/cassette_spec/example.yml +0 -110
  48. data/spec/fixtures/1.8.6/example_net_http.yml +0 -14
  49. data/spec/fixtures/1.8.6/example_net_http_request.yml +0 -12
  50. data/spec/fixtures/1.8.6/example_net_http_response.yml +0 -25
  51. data/spec/fixtures/1.8.6/fake_example.com_responses.yml +0 -90
  52. data/spec/fixtures/1.8.7/0_3_1_cassette.yml +0 -29
  53. data/spec/fixtures/1.8.7/cassette_spec/example.yml +0 -110
  54. data/spec/fixtures/1.8.7/example_net_http.yml +0 -14
  55. data/spec/fixtures/1.8.7/example_net_http_request.yml +0 -12
  56. data/spec/fixtures/1.8.7/example_net_http_response.yml +0 -25
  57. data/spec/fixtures/1.8.7/fake_example.com_responses.yml +0 -90
  58. data/spec/fixtures/1.9.1/0_3_1_cassette.yml +0 -29
  59. data/spec/fixtures/1.9.1/cassette_spec/example.yml +0 -110
  60. data/spec/fixtures/1.9.1/example_net_http.yml +0 -14
  61. data/spec/fixtures/1.9.1/example_net_http_request.yml +0 -12
  62. data/spec/fixtures/1.9.1/example_net_http_response.yml +0 -25
  63. data/spec/fixtures/1.9.1/fake_example.com_responses.yml +0 -90
  64. data/spec/http_stubbing_adapters/fakeweb_spec.rb +0 -24
  65. data/spec/http_stubbing_adapters/webmock_spec.rb +0 -23
  66. data/spec/spec.opts +0 -2
  67. data/spec/spec_helper.rb +0 -35
  68. data/spec/structs_spec.rb +0 -95
  69. data/spec/support/deprecated.rb +0 -18
  70. data/spec/support/disable_warnings.rb +0 -12
  71. data/spec/support/http_stubbing_adapter.rb +0 -113
  72. data/spec/support/temp_cassette_library_dir.rb +0 -16
  73. data/spec/task_runner_spec.rb +0 -59
  74. data/spec/vcr_spec.rb +0 -119
  75. data/vcr.gemspec +0 -147
@@ -1,49 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe VCR::Config do
4
- describe '#cassette_library_dir=' do
5
- temp_dir(File.expand_path(File.dirname(__FILE__) + '/fixtures/config_spec'))
6
-
7
- it 'creates the directory if it does not exist' do
8
- lambda { VCR::Config.cassette_library_dir = @temp_dir }.should change { File.exist?(@temp_dir) }.from(false).to(true)
9
- end
10
-
11
- it 'does not raise an error if given nil' do
12
- lambda { VCR::Config.cassette_library_dir = nil }.should_not raise_error
13
- end
14
- end
15
-
16
- describe '#default_cassette_options' do
17
- it 'always has a hash, even if it is set to nil' do
18
- VCR::Config.default_cassette_options = nil
19
- VCR::Config.default_cassette_options.should == {}
20
- end
21
- end
22
-
23
- describe '#http_stubbing_library' do
24
- it 'returns the configured value' do
25
- [:fakeweb, :webmock].each do |setting|
26
- VCR::Config.http_stubbing_library = setting
27
- VCR::Config.http_stubbing_library.should == setting
28
- end
29
- end
30
-
31
- context 'when set to nil' do
32
- before(:each) { VCR::Config.http_stubbing_library = nil }
33
-
34
- {
35
- [:FakeWeb, :WebMock] => nil,
36
- [] => nil,
37
- [:FakeWeb] => :fakeweb,
38
- [:WebMock] => :webmock
39
- }.each do |defined_constants, expected_return_value|
40
- it "returns #{expected_return_value.inspect} when these constants are defined: #{defined_constants.inspect}" do
41
- [:FakeWeb, :WebMock].each do |const|
42
- Object.should_receive(:const_defined?).with(const).and_return(defined_constants.include?(const))
43
- end
44
- VCR::Config.http_stubbing_library.should == expected_return_value
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,71 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe VCR::CucumberTags do
4
- before(:each) do
5
- @args = { :before => [], :after => [] }
6
- @blocks = { :before => [], :after => [] }
7
- end
8
-
9
- def Before(*args, &block)
10
- @args[:before] << args
11
- @blocks[:before] << block
12
- end
13
-
14
- def After(*args, &block)
15
- @args[:after] << args
16
- @blocks[:after] << block
17
- end
18
-
19
- describe '#tag' do
20
- [:before, :after].each do |hook|
21
- it "sets up a cucumber #{hook} hook for the given tag that creates a new cassette" do
22
- VCR.cucumber_tags { |t| t.tag 'tag_test' }
23
-
24
- @args[hook].should == [['@tag_test']]
25
-
26
- if hook == :before
27
- VCR.should_receive(:insert_cassette).with('cucumber_tags/tag_test', {})
28
- else
29
- VCR.should_receive(:eject_cassette)
30
- end
31
- @blocks[hook].should have(1).block
32
- @blocks[hook].first.call
33
- end
34
-
35
- it "sets up separate hooks for each tag, passing the given options to each cassette" do
36
- VCR.cucumber_tags { |t| t.tag 'tag_test1', 'tag_test2', :record => :none }
37
- @args[hook].should == [['@tag_test1'], ['@tag_test2']]
38
-
39
- if hook == :before
40
- VCR.should_receive(:insert_cassette).with('cucumber_tags/tag_test1', { :record => :none }).once
41
- VCR.should_receive(:insert_cassette).with('cucumber_tags/tag_test2', { :record => :none }).once
42
- else
43
- VCR.should_receive(:eject_cassette).twice
44
- end
45
- @blocks[hook].should have(2).blocks
46
- @blocks[hook].each { |b| b.call }
47
- end
48
-
49
- it "works with tags that start with an @" do
50
- VCR.cucumber_tags { |t| t.tag '@tag_test' }
51
- @args[hook].should == [['@tag_test']]
52
-
53
- if hook == :before
54
- VCR.should_receive(:insert_cassette).with('cucumber_tags/tag_test', {})
55
- else
56
- VCR.should_receive(:eject_cassette)
57
- end
58
- @blocks[hook].should have(1).block
59
- @blocks[hook].first.call
60
- end
61
- end
62
- end
63
-
64
- describe '.tags' do
65
- it 'returns the list of cucumber tags' do
66
- VCR.cucumber_tags { |t| t.tag 'tag1' }
67
- VCR.cucumber_tags { |t| t.tags 'tag7', 'tag12' }
68
- VCR::CucumberTags.tags[-3, 3].should == %w(@tag1 @tag7 @tag12)
69
- end
70
- end
71
- end
@@ -1,67 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Deprecations' do
4
- describe VCR do
5
- subject { VCR }
6
- deprecated :create_cassette!, :insert_cassette, "WARNING: VCR.create_cassette! is deprecated. Instead, use: VCR.insert_cassette."
7
- deprecated :destroy_cassette!, :eject_cassette, "WARNING: VCR.destroy_cassette! is deprecated. Instead, use: VCR.eject_cassette."
8
- deprecated :with_cassette, :use_cassette, "WARNING: VCR.with_cassette is deprecated. Instead, use: VCR.use_cassette."
9
- end
10
-
11
- describe VCR::Cassette do
12
- disable_warnings
13
- subject { VCR::Cassette.new('cassette name') }
14
- deprecated :destroy!, :eject, "WARNING: VCR::Cassette#destroy! is deprecated. Instead, use: VCR::Cassette#eject."
15
- deprecated :cache_file, :file, "WARNING: VCR::Cassette#cache_file is deprecated. Instead, use: VCR::Cassette#file."
16
-
17
- it 'delegates the :unregistered record option to :new_episodes' do
18
- cassette = VCR::Cassette.new('cassette name', :record => :unregistered)
19
- cassette.record_mode.should == :new_episodes
20
- end
21
-
22
- it "prints a warning: WARNING: VCR's :unregistered record mode is deprecated. Instead, use: :new_episodes." do
23
- Kernel.should_receive(:warn).with("WARNING: VCR's :unregistered record mode is deprecated. Instead, use: :new_episodes.")
24
- VCR::Cassette.new('cassette name', :record => :unregistered)
25
- end
26
- end
27
-
28
- describe VCR::Config do
29
- disable_warnings
30
- subject { VCR::Config }
31
- deprecated :cache_dir, :cassette_library_dir, "WARNING: VCR::Config.cache_dir is deprecated. Instead, use: VCR::Config.cassette_library_dir."
32
-
33
- it 'delegates #cache_dir= to #cassette_library_dir=' do
34
- subject.should_receive(:cassette_library_dir=).with(:value)
35
- subject.cache_dir = :value
36
- end
37
-
38
- it "prints a warning: WARNING: VCR::Config.cache_dir= is deprecated. Instead, use: VCR::Config.cassette_library_dir=." do
39
- subject.stub!(:cassette_library_dir=)
40
- subject.should_receive(:warn).with("WARNING: VCR::Config.cache_dir= is deprecated. Instead, use: VCR::Config.cassette_library_dir=.")
41
- subject.cache_dir = :value
42
- end
43
-
44
- describe '#default_cassette_record_mode=' do
45
- it 'sets the default_cassette_options[:record] option' do
46
- VCR::Cassette::VALID_RECORD_MODES.each do |mode|
47
- VCR::Config.default_cassette_options = nil
48
- VCR::Config.default_cassette_record_mode = mode
49
- VCR::Config.default_cassette_options[:record].should == mode
50
- end
51
- end
52
-
53
- it 'merges the :record option with the existing default_cassette_record options' do
54
- VCR::Config.default_cassette_options = { :an => :option }
55
- VCR::Config.default_cassette_record_mode = :all
56
- VCR::Config.default_cassette_options.should == { :an => :option, :record => :all }
57
- end
58
-
59
- it 'warns the user that it is deprecated' do
60
- VCR::Cassette::VALID_RECORD_MODES.each do |mode|
61
- VCR::Config.should_receive(:warn).with(%Q{WARNING: #default_cassette_record_mode is deprecated. Instead, use: "default_cassette_options = { :record => :#{mode.to_s} }"})
62
- VCR::Config.default_cassette_record_mode = mode
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,86 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe "Net::HTTP Response extensions" do
4
- context 'extending an already read response' do
5
- # disable VCR for this spec...
6
- before(:each) { VCR.insert_cassette('response_extension', :allow_real_http => lambda { |uri| true }) }
7
- after(:each) { VCR.eject_cassette }
8
-
9
- def self.it_allows_the_body_to_be_read_again
10
- let(:expected_regex) { /You have reached this web page by typing.*example\.com/ }
11
-
12
- it 'allows the body to be read using #body' do
13
- subject.body.to_s.should =~ expected_regex
14
- end
15
-
16
- it 'allows the body to be read using #read_body' do
17
- subject.read_body.to_s.should =~ expected_regex
18
- end
19
-
20
- it 'allows the body to be read using #read_body with a block' do
21
- yielded_body = ''
22
- ret_val = subject.read_body { |s| yielded_body << s }
23
- yielded_body.should =~ expected_regex
24
- ret_val.should be_instance_of(Net::ReadAdapter)
25
- end
26
-
27
- it 'allows the body to be read by passing a destination string to #read_body' do
28
- dest = ''
29
- ret_val = subject.read_body(dest)
30
- dest.should =~ expected_regex
31
- ret_val.should == dest
32
- end
33
-
34
- it 'raises an ArgumentError if both a destination string and a block is given to #read_body' do
35
- dest = ''
36
- expect { subject.read_body(dest) { |s| } }.should raise_error(ArgumentError, 'both arg and block given for HTTP method')
37
- end
38
-
39
- it 'raises an IOError when #read_body is called twice with a block' do
40
- subject.read_body { |s| }
41
- expect { subject.read_body { |s| } }.to raise_error(IOError, /read_body called twice/)
42
- end
43
-
44
- it 'raises an IOError when #read_body is called twice with a destination string' do
45
- dest = ''
46
- subject.read_body(dest)
47
- expect { subject.read_body(dest) }.to raise_error(IOError, /read_body called twice/)
48
- end
49
- end
50
-
51
- context 'when the body has already been read using #read_body and a block' do
52
- subject do
53
- http = Net::HTTP.new('example.com', 80)
54
- response = http.request_get('/') { |res| res.read_body { |s| } }
55
- response.extend VCR::Net::HTTPResponse
56
- response
57
- end
58
-
59
- it_allows_the_body_to_be_read_again
60
- end
61
-
62
- context 'when the body has already been read using #read_body and a dest string' do
63
- subject do
64
- http = Net::HTTP.new('example.com', 80)
65
- dest = ''
66
- response = http.request_get('/') { |res| res.read_body(dest) }
67
- response.extend VCR::Net::HTTPResponse
68
- response
69
- end
70
-
71
- it_allows_the_body_to_be_read_again
72
- end
73
-
74
- context 'when the body has already been read using #body' do
75
- subject do
76
- http = Net::HTTP.new('example.com', 80)
77
- response = http.request_get('/')
78
- response.body
79
- response.extend VCR::Net::HTTPResponse
80
- response
81
- end
82
-
83
- it_allows_the_body_to_be_read_again
84
- end
85
- end
86
- end
@@ -1,72 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe "Net::HTTP Extensions" do
4
- before(:each) do
5
- VCR.stub!(:current_cassette).and_return(@current_cassette = mock)
6
- @uri = URI.parse('http://example.com')
7
- end
8
-
9
- it 'works when there is no current cassette' do
10
- VCR.stub!(:current_cassette).and_return(nil)
11
- lambda { Net::HTTP.get(@uri) }.should_not raise_error
12
- end
13
-
14
- context 'when current_cassette.allow_real_http_requests_to? returns false' do
15
- before(:each) do
16
- @current_cassette.should_receive(:allow_real_http_requests_to?).at_least(:once).with(@uri).and_return(false)
17
- end
18
-
19
- describe 'a request that is not registered with the http stubbing adapter' do
20
- before(:each) do
21
- VCR.http_stubbing_adapter.should_receive(:request_stubbed?).with(anything, 'http://example.com:80/').and_return(false)
22
- end
23
-
24
- def perform_get_with_returning_block
25
- Net::HTTP.new('example.com', 80).request(Net::HTTP::Get.new('/', {})) do |response|
26
- return response
27
- end
28
- end
29
-
30
- it 'calls #record_http_interaction on the current cassette' do
31
- interaction = VCR::HTTPInteraction.new
32
- VCR::HTTPInteraction.should_receive(:from_net_http_objects).and_return(interaction)
33
- @current_cassette.should_receive(:record_http_interaction).with(interaction)
34
- Net::HTTP.get(@uri)
35
- end
36
-
37
- it 'calls #record_http_interaction only once, even when Net::HTTP internally recursively calls #request' do
38
- @current_cassette.should_receive(:record_http_interaction).once
39
- Net::HTTP.new('example.com', 80).post('/', nil)
40
- end
41
-
42
- it 'calls #record_http_interaction when Net::HTTP#request is called with a block with a return statement' do
43
- @current_cassette.should_receive(:record_http_interaction).once
44
- perform_get_with_returning_block
45
- end
46
- end
47
-
48
- describe 'a request that is registered with the http stubbing adapter' do
49
- it 'does not call #record_http_interaction on the current cassette' do
50
- VCR.http_stubbing_adapter.should_receive(:request_stubbed?).with(:get, 'http://example.com:80/').and_return(true)
51
- @current_cassette.should_not_receive(:record_http_interaction)
52
- Net::HTTP.get(@uri)
53
- end
54
- end
55
- end
56
-
57
- context 'when current_cassette.allow_real_http_requests_to? returns true' do
58
- before(:each) do
59
- @current_cassette.should_receive(:allow_real_http_requests_to?).with(@uri).and_return(true)
60
- end
61
-
62
- it 'does not call #record_http_interaction on the current cassette' do
63
- @current_cassette.should_receive(:record_http_interaction).never
64
- Net::HTTP.get(@uri)
65
- end
66
-
67
- it 'uses VCR.http_stubbing_adapter.with_http_connections_allowed_set_to(true) to make the request' do
68
- VCR.http_stubbing_adapter.should_receive(:with_http_connections_allowed_set_to).with(true).and_yield
69
- Net::HTTP.get(@uri)
70
- end
71
- end
72
- end
@@ -1,10 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe 'Net::ReadAdapter extensions' do
4
- it 'delegates yaml serialization to the body string' do
5
- adapter = Net::ReadAdapter.new(proc { |s| })
6
- adapter << 'some text'
7
- adapter << ' and some more text'
8
- adapter.to_yaml.should == 'some text and some more text'.to_yaml
9
- end
10
- end
@@ -1,29 +0,0 @@
1
- ---
2
- - !ruby/struct:VCR::RecordedResponse
3
- method: :post
4
- uri: http://example.com:80/
5
- response: !ruby/object:Net::HTTPOK
6
- body: The response from example.com
7
- body_exist: true
8
- code: "200"
9
- header:
10
- etag:
11
- - "\"24ec5-1b6-4059a80bfd280\""
12
- last-modified:
13
- - Tue, 15 Nov 2005 13:24:10 GMT
14
- content-type:
15
- - text/html; charset=UTF-8
16
- connection:
17
- - close
18
- server:
19
- - Apache/2.2.3 (CentOS)
20
- date:
21
- - Wed, 31 Mar 2010 02:43:26 GMT
22
- content-length:
23
- - "438"
24
- accept-ranges:
25
- - bytes
26
- http_version: "1.1"
27
- message: OK
28
- read: true
29
- socket:
@@ -1,110 +0,0 @@
1
- ---
2
- - !ruby/struct:VCR::HTTPInteraction
3
- request: !ruby/struct:VCR::Request
4
- method: :get
5
- uri: http://example.com:80/
6
- body:
7
- headers:
8
- response: !ruby/struct:VCR::Response
9
- status: !ruby/struct:VCR::ResponseStatus
10
- code: 200
11
- message: OK
12
- headers:
13
- last-modified:
14
- - Tue, 15 Nov 2005 13:24:10 GMT
15
- connection:
16
- - Keep-Alive
17
- date:
18
- - Thu, 25 Feb 2010 07:52:38 GMT
19
- content-type:
20
- - text/html; charset=UTF-8
21
- etag:
22
- - "\"24ec5-1b6-4059a80bfd280\""
23
- server:
24
- - Apache/2.2.3 (CentOS)
25
- content-length:
26
- - "438"
27
- age:
28
- - "3009"
29
- accept-ranges:
30
- - bytes
31
- body: |
32
- <HTML>
33
- <HEAD>
34
- <TITLE>Example Web Page</TITLE>
35
- </HEAD>
36
- <body>
37
- <p>You have reached this web page by typing &quot;example.com&quot;,
38
- &quot;example.net&quot;,
39
- or &quot;example.org&quot; into your web browser.</p>
40
- <p>These domain names are reserved for use in documentation and are not available
41
- for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC
42
- 2606</a>, Section 3.</p>
43
- </BODY>
44
- </HTML>
45
-
46
- http_version: "1.1"
47
- - !ruby/struct:VCR::HTTPInteraction
48
- request: !ruby/struct:VCR::Request
49
- method: :get
50
- uri: http://example.com:80/foo
51
- body:
52
- headers:
53
- response: !ruby/struct:VCR::Response
54
- status: !ruby/struct:VCR::ResponseStatus
55
- code: 404
56
- message: Not Found
57
- headers:
58
- connection:
59
- - close
60
- content-type:
61
- - text/html; charset=iso-8859-1
62
- date:
63
- - Thu, 25 Feb 2010 07:52:38 GMT
64
- server:
65
- - Apache/2.2.3 (CentOS)
66
- content-length:
67
- - "277"
68
- body: |
69
- <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
70
- <html><head>
71
- <title>404 Not Found</title>
72
- </head><body>
73
- <h1>Not Found</h1>
74
- <p>The requested URL /foo was not found on this server.</p>
75
- <hr>
76
- <address>Apache/2.2.3 (CentOS) Server at example.com Port 80</address>
77
- </body></html>
78
-
79
- http_version: "1.1"
80
- - !ruby/struct:VCR::HTTPInteraction
81
- request: !ruby/struct:VCR::Request
82
- method: :get
83
- uri: http://example.com:80/
84
- body:
85
- headers:
86
- response: !ruby/struct:VCR::Response
87
- status: !ruby/struct:VCR::ResponseStatus
88
- code: 200
89
- message: OK
90
- headers:
91
- last-modified:
92
- - Tue, 15 Nov 2005 13:24:10 GMT
93
- connection:
94
- - Keep-Alive
95
- date:
96
- - Thu, 25 Feb 2010 07:52:38 GMT
97
- content-type:
98
- - text/html; charset=UTF-8
99
- etag:
100
- - "\"24ec5-1b6-4059a80bfd280\""
101
- server:
102
- - Apache/2.2.3 (CentOS)
103
- content-length:
104
- - "438"
105
- age:
106
- - "3009"
107
- accept-ranges:
108
- - bytes
109
- body: Another example.com response
110
- http_version: "1.1"