network-2.3.0.7: Low-level networking interface

Portabilityportable
Stabilityprovisional
MaintainerGraham Klyne <gk@ninebynine.org>

Network.URI

Contents

Description

This module defines functions for handling URIs. It presents substantially the same interface as the older GHC Network.URI module, but is implemented using Parsec rather than a Regex library that is not available with Hugs. The internal representation of URI has been changed so that URI strings are more completely preserved when round-tripping to a URI value and back.

In addition, four methods are provided for parsing different kinds of URI string (as noted in RFC3986): parseURI, parseURIReference, parseRelativeReference and parseAbsoluteURI.

Further, four methods are provided for classifying different kinds of URI string (as noted in RFC3986): isURI, isURIReference, isRelativeReference and isAbsoluteURI.

The long-standing official reference for URI handling was RFC2396 [1], as updated by RFC 2732 [2], but this was replaced by a new specification, RFC3986 [3] in January 2005. This latter specification has been used as the primary reference for constructing the URI parser implemented here, and it is intended that there is a direct relationship between the syntax definition in that document and this parser implementation.

RFC 1808 [4] contains a number of test cases for relative URI handling. Dan Connolly's Python module uripath.py [5] also contains useful details and test cases.

Some of the code has been copied from the previous GHC implementation, but the parser is replaced with one that performs more complete syntax checking of the URI itself, according to RFC3986 [3].

References

  1. http://www.ietf.org/rfc/rfc2396.txt
  2. http://www.ietf.org/rfc/rfc2732.txt
  3. http://www.ietf.org/rfc/rfc3986.txt
  4. http://www.ietf.org/rfc/rfc1808.txt
  5. http://www.w3.org/2000/10/swap/uripath.py

Synopsis

The URI type

data URI Source

Represents a general universal resource identifier using its component parts.

For example, for the URI

   foo://anonymous@www.haskell.org:42/ghc?query#frag

the components are:

Constructors

URI 

Fields

uriScheme :: String
foo:
uriAuthority :: Maybe URIAuth
//anonymous@www.haskell.org:42
uriPath :: String
/ghc
uriQuery :: String
?query
uriFragment :: String
#frag

Instances

data URIAuth Source

Type for authority value within a URI

Constructors

URIAuth 

Fields

uriUserInfo :: String
anonymous@
uriRegName :: String
www.haskell.org
uriPort :: String
:42

nullURI :: URISource

Blank URI

Parsing

parseURI :: String -> Maybe URISource

Turn a string containing a URI into a URI. Returns Nothing if the string is not a valid URI; (an absolute URI with optional fragment identifier).

NOTE: this is different from the previous network.URI, whose parseURI function works like parseURIReference in this module.

parseURIReference :: String -> Maybe URISource

Parse a URI reference to a URI value. Returns Nothing if the string is not a valid URI reference. (an absolute or relative URI with optional fragment identifier).

parseRelativeReference :: String -> Maybe URISource

Parse a relative URI to a URI value. Returns Nothing if the string is not a valid relative URI. (a relative URI with optional fragment identifier).

parseAbsoluteURI :: String -> Maybe URISource

Parse an absolute URI to a URI value. Returns Nothing if the string is not a valid absolute URI. (an absolute URI without a fragment identifier).

Test for strings containing various kinds of URI

isURI :: String -> BoolSource

Test if string contains a valid URI (an absolute URI with optional fragment identifier).

isURIReference :: String -> BoolSource

Test if string contains a valid URI reference (an absolute or relative URI with optional fragment identifier).

isRelativeReference :: String -> BoolSource

Test if string contains a valid relative URI (a relative URI with optional fragment identifier).

isAbsoluteURI :: String -> BoolSource

Test if string contains a valid absolute URI (an absolute URI without a fragment identifier).

isIPv6address :: String -> BoolSource

Test if string contains a valid IPv6 address

isIPv4address :: String -> BoolSource

Test if string contains a valid IPv4 address

Relative URIs

relativeTo :: URI -> URI -> Maybe URISource

Compute an absolute URI for a supplied URI relative to a given base.

nonStrictRelativeTo :: URI -> URI -> Maybe URISource

Returns a new URI which represents the value of the first URI interpreted as relative to the second URI. For example:

 "foo" `relativeTo` "http://bar.org/" = "http://bar.org/foo"
 "http:foo" `nonStrictRelativeTo` "http://bar.org/" = "http://bar.org/foo"

Algorithm from RFC3986 [3], section 5.2.2

relativeFrom :: URI -> URI -> URISource

Returns a new URI which represents the relative location of the first URI with respect to the second URI. Thus, the values supplied are expected to be absolute URIs, and the result returned may be a relative URI.

Example:

 "http://example.com/Root/sub1/name2#frag"
   `relativeFrom` "http://example.com/Root/sub2/name2#frag"
   == "../sub1/name2#frag"

There is no single correct implementation of this function, but any acceptable implementation must satisfy the following:

 (uabs `relativeFrom` ubase) `relativeTo` ubase == uabs

For any valid absolute URI. (cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html http://lists.w3.org/Archives/Public/uri/2003Jan/0005.html)

Operations on URI strings

Support for putting strings into URI-friendly escaped format and getting them back again. This can't be done transparently in all cases, because certain characters have different meanings in different kinds of URI. The URI spec [3], section 2.4, indicates that all URI components should be escaped before they are assembled as a URI: "Once produced, a URI is always in its percent-encoded form"

uriToString :: (String -> String) -> URI -> ShowSSource

Turn a URI into a string.

Uses a supplied function to map the userinfo part of the URI.

The Show instance for URI uses a mapping that hides any password that may be present in the URI. Use this function with argument id to preserve the password in the formatted output.

isReserved :: Char -> BoolSource

Returns True if the character is a "reserved" character in a URI. To include a literal instance of one of these characters in a component of a URI, it must be escaped.

isUnreserved :: Char -> BoolSource

Returns True if the character is an "unreserved" character in a URI. These characters do not need to be escaped in a URI. The only characters allowed in a URI are either "reserved", "unreserved", or an escape sequence (% followed by two hex digits).

isAllowedInURI :: Char -> BoolSource

Returns True if the character is allowed in a URI.

isUnescapedInURI :: Char -> BoolSource

Returns True if the character is allowed unescaped in a URI.

escapeURIChar :: (Char -> Bool) -> Char -> StringSource

Escape character if supplied predicate is not satisfied, otherwise return character as singleton string.

escapeURIStringSource

Arguments

:: (Char -> Bool)

a predicate which returns False if the character should be escaped

-> String

the string to process

-> String

the resulting URI string

Can be used to make a string valid for use in a URI.

unEscapeString :: String -> StringSource

Turns all instances of escaped characters in the string back into literal characters.

URI Normalization functions

normalizeCase :: String -> StringSource

Case normalization; cf. RFC3986 section 6.2.2.1 NOTE: authority case normalization is not performed

normalizeEscape :: String -> StringSource

Encoding normalization; cf. RFC3986 section 6.2.2.2

normalizePathSegments :: String -> StringSource

Path segment normalization; cf. RFC3986 section 6.2.2.4

Deprecated functions