> For the complete documentation index, see [llms.txt](https://nicolasiensen.gitbook.io/vcr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nicolasiensen.gitbook.io/vcr/configuration/uri_parser.md).

# 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".
