VCR
1.0.0
1.0.0
  • Initial page
  • record_modes
    • :none
    • :new_episodes
    • :all
    • :once
  • test_frameworks
    • Usage with Test::Unit
    • Usage with Cucumber
    • Usage with RSpec metadata
  • request_matching
    • Matching on Headers
    • Matching on Body
    • Matching on Method
    • URI without param(s)
    • Identical requests are replayed in sequence
    • Matching on Body
    • Playback repeats
    • Matching on URI
    • Matching on Host
    • Matching on Path
    • Matching on Query string
    • Register and use a custom matcher
  • cassettes
    • exclusive cassette
    • Update content_length header
    • Error for HTTP request made when no cassette is in use
    • Naming
    • Allow Unused HTTP Interactions
    • Freezing Time
    • Decode compressed response
    • Dynamic ERB cassettes
    • Automatic Re-recording
    • Cassette format
  • configuration
    • hook_into
    • cassette_library_dir
    • Filter sensitive data
    • Ignore Request
    • Debug Logging
    • default_cassette_options
    • query_parser
    • uri_parser
    • Allow HTTP connections when no cassette
    • Preserve Exact Body Bytes
  • http_libraries
    • EM HTTP Request
    • Net::HTTP
  • hooks
    • before_playback hook
    • after_http_request hook
    • before_http_request hook
    • before_record hook
    • around_http_request hook
  • middleware
    • Faraday middleware
    • Rack
Powered by GitBook
On this page
  • Background ()
  • the VCR uri parser gets its value from uri_parser
  • the uri_parser defaults to the standard library's URI

Was this helpful?

  1. configuration

uri_parser

By default, VCR will parse URIs using URI from the Ruby standard library. There are some URIs seen out in the wild that URI cannot parse properly. You can set the uri_parser configuration option to use a different parser (such as Addressable::URI) to work with these URIs.

The configured URI parser needs to expose a .parse class method that returns an instance of the uri. This uri instance needs to implement the following API:

  • #scheme => a string

  • #host => a string

  • #port => a fixnum

  • #path => a string

  • #query => a string

  • #to_s => a string

  • #port=

  • #query=

  • #== => boolean

Background ()

Given a file named "cassettes/example.yml" with:

---
http_interactions:
- request:
    method: get
    uri: http://example.com/hello
    body:
      encoding: UTF-8
      string: ""
    headers: {}
  response:
    status:
      code: 200
      message: OK
    headers:
      Content-Length:
      - "5"
    body:
      encoding: UTF-8
      string: Hello
    http_version: "1.1"
  recorded_at: Tue, 25 Sep 2012 04:58:44 GMT
recorded_with: VCR 2.2.5

the VCR uri parser gets its value from uri_parser

Given a file named "uri_parser.rb" with:

require 'vcr'
require 'uri'

module MyURI
  def self.parse(url)
    uri = URI.parse(url)
    uri.host = 'example.com'
    uri.path = '/hello'
    uri
  end
end

VCR.configure do |c|
  c.uri_parser = MyURI
  c.hook_into :webmock
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('example') do
  puts Net::HTTP.get_response('evil.org', '/projects').body
end

When I run ruby uri_parser.rb

Then it should pass with "Hello".

the uri_parser defaults to the standard library's URI

Given a file named "uri_parser_default.rb" with:

require 'vcr'

VCR.configure do |c|
  c.hook_into :webmock
  c.cassette_library_dir = 'cassettes'
end

VCR.use_cassette('example') do
  puts Net::HTTP.get_response('example.com', '/hello').body
end

When I run ruby uri_parser_default.rb

Then it should pass with "Hello".

Previousquery_parserNextAllow HTTP connections when no cassette

Last updated 5 years ago

Was this helpful?