class URI

Overview

This class represents a URI reference as defined by RFC 3986: Uniform Resource Identifier (URI): Generic Syntax.

This class provides constructors for creating URI instances from their components or by parsing their string forms and methods for accessing the various components of an instance.

Basic example:

require "uri"

uri = URI.parse "http://foo.com/posts?id=30&limit=5#time=1305298413"
# => #<URI:0x1003f1e40 @scheme="http", @host="foo.com", @port=nil, @path="/posts", @query="id=30&limit=5", ... >
uri.scheme # => "http"
uri.host   # => "foo.com"
uri.query  # => "id=30&limit=5"
uri.to_s   # => "http://foo.com/posts?id=30&limit=5#time=1305298413"

Defined in:

uri/punycode.cr
uri/uri_parser.cr
uri.cr

Constructors

Class Method Summary

Instance Method Summary

Instance methods inherited from class Reference

==(other : self)
==(other : JSON::Any)
==(other : YAML::Any)
==(other)
==
, dup dup, hash(hasher) hash, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, pretty_print(pp) : Nil pretty_print, same?(other : Reference)
same?(other : Nil)
same?
, to_s(io : IO) : Nil to_s

Constructor methods inherited from class Reference

new new

Instance methods inherited from class Object

!=(other) !=, !~(other) !~, ==(other) ==, ===(other : JSON::Any)
===(other : YAML::Any)
===(other)
===
, =~(other) =~, class class, dup dup, hash(hasher)
hash
hash
, inspect(io : IO)
inspect
inspect
, itself itself, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, tap(&block) tap, to_json(io : IO)
to_json
to_json
, to_pretty_json(indent : String = " ")
to_pretty_json(io : IO, indent : String = " ")
to_pretty_json
, to_s
to_s(io : IO)
to_s
, to_yaml(io : IO)
to_yaml
to_yaml
, try(&block) try, unsafe_as(type : T.class) forall T unsafe_as

Constructor methods inherited from class Object

from_json(string_or_io, root : String) : self
from_json(string_or_io) : self
from_json
, from_yaml(string_or_io : String | IO) : self from_yaml

Constructor Detail

def self.new(scheme = nil, host = nil, port = nil, path = nil, query = nil, user = nil, password = nil, fragment = nil, opaque = nil) #

[View source]
def self.parse(raw_url : String) : URI #

Parses raw_url into an URI. The raw_url may be relative or absolute.

require "uri"

uri = URI.parse("http://crystal-lang.org") # => #<URI:0x1068a7e40 @scheme="http", @host="crystal-lang.org", ... >
uri.scheme                                 # => "http"
uri.host                                   # => "crystal-lang.org"

[View source]

Class Method Detail

def self.default_port(scheme : String) : Int32? #

Returns the default port for the given scheme if known, otherwise returns nil.

URI.default_port "http"  # => 80
URI.default_port "ponzi" # => nil

[View source]
def self.escape(string : String, io : IO, space_to_plus = false) #

URL-encode a String and write the result to an IO.


[View source]
def self.escape(string : String, space_to_plus = false) : String #

URL-encode a String.

If space_to_plus is true, it replace space character (0x20) to '+' and '+' is encoded to '%2B'. e.g. application/x-www-form-urlencoded want this replace.

URI.escape("'Stop!' said Fred")                      # => "%27Stop%21%27%20said%20Fred"
URI.escape("'Stop!' said Fred", space_to_plus: true) # => "%27Stop%21%27+said+Fred"

[View source]
def self.escape(string : String, io : IO, space_to_plus = false, &block) #

URL-encode a String and write the result to an IO.

This method requires block.


[View source]
def self.escape(string : String, space_to_plus = false, &block) : String #

URL-encode a String.

This method requires block, the block is called with each characters whose code is less than 0x80. The characters that block returns true are not escaped, other characters are escaped.

# Escape URI path
URI.escape("/foo/file?(1).txt") do |byte|
  URI.unreserved?(byte) || byte.chr == '/'
end
# => "/foo/file%3F%281%29.txt"

[View source]
def self.reserved?(byte) : Bool #

Returns whether given byte is reserved character defined in RFC 3986.

Reserved characters are ':', '/', '?', '#', '[', ']', '@', '!', '$', '&', "'", '(', ')', '*', '+', ',', ';' and '='.


[View source]
def self.set_default_port(scheme : String, port : Int32?) : Nil #

Registers the default port for the given scheme.

If port is nil, the existing default port for the scheme, if any, will be unregistered.

URI.set_default_port "ponzi", 9999

[View source]
def self.unescape(string : String, io : IO, plus_to_space = false) #

URL-decode a string and write the result to an IO.


[View source]
def self.unescape(string : String, plus_to_space = false) : String #

URL-decode a String.

If plus_to_space is true, it replace plus character (0x2B) to ' '. e.g. application/x-www-form-urlencoded wants this replace.

URI.unescape("%27Stop%21%27%20said%20Fred")                  # => "'Stop!' said Fred"
URI.unescape("%27Stop%21%27+said+Fred", plus_to_space: true) # => "'Stop!' said Fred"

[View source]
def self.unescape(string : String, io : IO, plus_to_space = false, &block) #

URL-decode a String and write the result to an IO.

This method requires block.


[View source]
def self.unescape(string : String, plus_to_space = false, &block) : String #

URL-decode a String.

This method requires block, the block is called with each bytes whose is less than 0x80. The bytes that block returns true are not unescaped, other characters are unescaped.


[View source]
def self.unreserved?(byte) : Bool #

Returns whether given byte is unreserved character defined in RFC 3986.

Unreserved characters are alphabet, digit, '_', '.', '-', '~'.


[View source]

Instance Method Detail

def ==(other : self) #

def absolute? #

Returns true if URI has a scheme specified.


[View source]
def fragment : String? #

Returns the fragment component of the URI.

URI.parse("http://foo.com/bar#section1").fragment # => "section1"

[View source]
def fragment=(fragment : String?) #

Sets the fragment component of the URI.


[View source]
def full_path #

Returns the full path of this URI.

uri = URI.parse "http://foo.com/posts?id=30&limit=5#time=1305298413"
uri.full_path # => "/posts?id=30&limit=5"

[View source]
def hash(hasher) #

def host : String? #

Returns the host component of the URI.

URI.parse("http://foo.com").host # => "foo.com"

[View source]
def host=(host : String?) #

Sets the host component of the URI.


[View source]
def hostname #

Returns the host part of the URI and unwrap brackets for IPv6 addresses.

URI.parse("http://[::1]/bar").hostname # => "::1"
URI.parse("http://[::1]/bar").host     # => "[::1]"

[View source]
def normalize #

Returns normalized URI.


[View source]
def normalize! #

Destructive normalize.


[View source]
def opaque : String? #

Returns the opaque component of the URI.

URI.parse("mailto:alice@example.com").opaque # => "alice@example.com"

[View source]
def opaque=(opaque : String?) #

Sets the opaque component of the URI.


[View source]
def password : String? #

Returns the password component of the URI.

URI.parse("http://admin:password@foo.com").password # => "password"

[View source]
def password=(password : String?) #

Sets the password component of the URI.


[View source]
def path : String? #

Returns the path component of the URI.

URI.parse("http://foo.com/bar").path # => "/bar"

[View source]
def path=(path : String?) #

Sets the path component of the URI.


[View source]
def port : Int32? #

Returns the port component of the URI.

URI.parse("http://foo.com:5432").port # => 5432

[View source]
def port=(port : Int32?) #

Sets the port component of the URI.


[View source]
def query : String? #

Returns the query component of the URI.

URI.parse("http://foo.com/bar?q=1").query # => "q=1"

[View source]
def query=(query : String?) #

Sets the query component of the URI.


[View source]
def relative? #

Returns true if URI does not have a scheme specified.


[View source]
def scheme : String? #

Returns the scheme component of the URI.

URI.parse("http://foo.com").scheme           # => "http"
URI.parse("mailto:alice@example.com").scheme # => "mailto"

[View source]
def scheme=(scheme : String?) #

Sets the scheme component of the URI.


[View source]
def to_s(io : IO) #

[View source]
def user : String? #

Returns the user component of the URI.

URI.parse("http://admin:password@foo.com").user # => "admin"

[View source]
def user=(user : String?) #

Sets the user component of the URI.


[View source]
def userinfo #

Returns the user-information component containing the provided username and password.

uri = URI.parse "http://admin:password@foo.com"
uri.userinfo # => "admin:password"

[View source]