# Net::HTTP

There are many ways to use Net::HTTP. The scenarios below provide regression tests for some Net::HTTP APIs that have not worked properly with VCR and WebMock in the past (but have since been fixed).

## Background ()

*Given* a file named "vcr\_setup.rb" with:

```
require 'ostruct'

if ARGV[0] == '--with-server'
  $server = start_sinatra_app do
    get('/')  { 'VCR works with Net::HTTP gets!' }
    post('/') { 'VCR works with Net::HTTP posts!' }
  end
else
  $server = OpenStruct(:port => 0)
end

require 'vcr'

VCR.configure do |c|
  c.default_cassette_options = {
    :match_requests_on => [:method, :host, :path]
  }
end
```

## Calling #post on new Net::HTTP instance

*Given* a file named "vcr\_net\_http.rb" with:

```
require 'vcr_setup.rb'

VCR.configure do |c|
  c.hook_into <hook_into>
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('net_http') do
  puts Net::HTTP.new('localhost', $server.port).post('/', '').body
end
```

*When* I run `ruby vcr_net_http.rb --with-server`

*Then* the output should contain "VCR works with Net::HTTP posts!"

*And* the file "cassettes/net\_http.yml" should contain "VCR works with Net::HTTP posts!"

*When* I run `ruby vcr_net_http.rb`

*Then* the output should contain "VCR works with Net::HTTP posts!".

### Examples

| hook\_into |
| ---------- |
| :webmock   |

## Return from yielded block

*Given* a file named "vcr\_net\_http.rb" with:

```
require 'vcr_setup.rb'

VCR.configure do |c|
  c.hook_into <hook_into>
  c.cassette_library_dir = 'cassettes'
end

def perform_request
  Net::HTTP.new('localhost', $server.port).request(Net::HTTP::Get.new('/', {})) do |response|
    return response
  end
end

VCR.use_cassette('net_http') do
  puts perform_request.body
end
```

*When* I run `ruby vcr_net_http.rb --with-server`

*Then* the output should contain "VCR works with Net::HTTP gets!"

*And* the file "cassettes/net\_http.yml" should contain "VCR works with Net::HTTP gets!"

*When* I run `ruby vcr_net_http.rb`

*Then* the output should contain "VCR works with Net::HTTP gets!".

### Examples

| hook\_into |
| ---------- |
| :webmock   |

## Use Net::ReadAdapter to read body in fragments

*Given* a file named "vcr\_net\_http.rb" with:

```
require 'vcr_setup.rb'

VCR.configure do |c|
  c.hook_into <hook_into>
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('net_http') do
  body = ''

  Net::HTTP.new('localhost', $server.port).request_get('/') do |response|
    response.read_body { |frag| body << frag }
  end

  puts body
end
```

*When* I run `ruby vcr_net_http.rb --with-server`

*Then* the output should contain "VCR works with Net::HTTP gets!"

*And* the file "cassettes/net\_http.yml" should contain "VCR works with Net::HTTP gets!"

*When* I run `ruby vcr_net_http.rb`

*Then* the output should contain "VCR works with Net::HTTP gets!".

### Examples

| hook\_into |
| ---------- |
| :webmock   |

## Use open-uri (which is built on top of Net::HTTP and uses a seldom-used Net::HTTP API)

*Given* a file named "vcr\_net\_http.rb" with:

```
require 'open-uri'
require 'vcr_setup.rb'

VCR.configure do |c|
  c.hook_into <hook_into>
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('net_http') do
  puts open("http://localhost:#{$server.port}/").read
end
```

*When* I run `ruby vcr_net_http.rb --with-server`

*Then* the output should contain "VCR works with Net::HTTP gets!"

*And* the file "cassettes/net\_http.yml" should contain "VCR works with Net::HTTP gets!"

*When* I run `ruby vcr_net_http.rb`

*Then* the output should contain "VCR works with Net::HTTP gets!".

### Examples

| hook\_into |
| ---------- |
| :webmock   |

## Make an HTTPS request

*Given* a file named "vcr\_https.rb" with:

```
require 'vcr'

VCR.configure do |c|
  c.hook_into <hook_into>
  c.cassette_library_dir = 'cassettes'
end

uri = URI("https://gist.githubusercontent.com/myronmarston/fb555cb593f3349d53af/raw/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist")

VCR.use_cassette('https') do
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  response = http.request_get(uri.path)

  puts response.body
end
```

*When* I run `ruby vcr_https.rb`

*Then* the output should contain "VCR gist"

*And* the file "cassettes/https.yml" should contain "VCR gist"

*When* I modify the file "cassettes/https.yml" to replace "VCR gist" with "HTTPS replaying works"

*And* I run `ruby vcr_https.rb`

*Then* the output should contain "HTTPS replaying works".

### Examples

| hook\_into |
| ---------- |
| :webmock   |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://andrewmcodes.gitbook.io/vcr/http_libraries/net_http.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
