VCR
v-6.0.0
v-6.0.0
  • Introduction
  • Upgrade
  • Changelog
  • About These Examples
  • License
  • Contributing
  • Cassettes
    • Cassette Format
    • Naming
    • Error for HTTP Request Made When No Cassette Is in Use
    • Dynamic ERB Cassettes
    • Automatic Re-Recording
    • Exclusive Cassette
    • Update Content Length Header
    • Decode Compressed Response
    • Allow Unused HTTP Interactions
    • Freezing Time
  • Record modes
    • Once
    • New Episodes
    • None
    • All
    • Record on Error
  • Configuration
    • Cassette Library Dir
    • Hook Into
    • Default Cassette Options
    • Ignore Request
    • Filter Sensitive Data
    • Allow HTTP Connections When No Cassette
    • Debug Logging
    • Preserve Exact Body Bytes
    • URI Parser
    • Query Parser
  • Hooks
    • Before Record Hook
    • Before Playback Hook
    • Before HTTP Request Hook
    • After HTTP Request Hook
    • Around HTTP Request Hook
  • Request matching
    • Introduction
    • Matching on Method
    • Matching on URI
    • Matching on Host
    • Matching on Path
    • Matching on Query String
    • Matching on Body
    • Matching on Headers
    • Identical Requests Are Replayed in Sequence
    • Register and Use a Custom Matcher
    • URI Without Param(s)
    • Playback Repeats
    • Matching on Body as JSON
  • Test frameworks
    • Usage With Test::Unit
    • Usage With RSpec Metadata
    • Usage With Cucumber
  • Middleware
    • Rack
    • Faraday Middleware
  • HTTP Libraries
    • Net::HTTP
    • EM HTTP Request
Powered by GitBook
On this page
  • Background ()
  • the VCR query parser gets its value from query_parser
  • the query_parser defaults to the standard library's CGI.parse

Was this helpful?

  1. Configuration

Query Parser

By default, VCR will parse query strings using CGI.parse from the Ruby standard library. This may not be the most optimal or performant library available. You can set the query_parser configuration option to use a different parser (such as Rack::Utils.method(:parse_query)) to decode, normalize, and/or provide a comparison object for query strings.

The configured query parser needs to expose a .call method that returns an object which is comparable. This instance needs to implement the following API:

  • #== => boolean

Background ()

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

---
http_interactions:
- request:
    method: get
    uri: http://url.example.com/?bravo=2&alpha=1
    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 query parser gets its value from query_parser

Given a file named "query_parser.rb" with:

require 'vcr'
require 'rack'

VCR.configure do |c|
  c.query_parser = lambda { |query| raise query.inspect }
  c.default_cassette_options = {:match_requests_on => [:query]}
  c.hook_into :webmock
  c.cassette_library_dir = 'cassettes'
end

uri = URI.parse('http://other-url.example.com/?bravo=2&alpha=1')
VCR.use_cassette('example') do
  puts Net::HTTP.get_response(uri).body
end

When I run ruby query_parser.rb

Then it should fail with an error like:

"alpha=1&bravo=2"

the query_parser defaults to the standard library's CGI.parse

Given a file named "query_parser_default.rb" with:

require 'vcr'

VCR.configure do |c|
  c.hook_into :webmock
  c.default_cassette_options = {:match_requests_on => [:query]}
  c.cassette_library_dir = 'cassettes'
end

uri = URI.parse('http://other-url.example.com/?bravo=2&alpha=1')
VCR.use_cassette('example') do
  puts Net::HTTP.get_response(uri).body
end

When I run ruby query_parser_default.rb

Then it should pass with "Hello".

PreviousURI ParserNextBefore Record Hook

Last updated 4 years ago

Was this helpful?