Copyright | Will Thompson, Iñaki García Etxebarria and Jonas Platte |
---|---|
License | LGPL-2.1 |
Maintainer | Iñaki García Etxebarria (garetxe@gmail.com) |
Safe Haskell | None |
Language | Haskell2010 |
A URI
represents a (parsed) URI. URI
supports RFC 3986
(URI Generic Syntax), and can parse any valid URI. However, libsoup
only uses "http" and "https" URIs internally; You can use
SOUP_URI_VALID_FOR_HTTP()
to test if a URI
is a valid HTTP
URI.
scheme
will always be set in any URI. It is an interned string and
is always all lowercase. (If you parse a URI with a non-lowercase
scheme, it will be converted to lowercase.) The macros
SOUP_URI_SCHEME_HTTP
and SOUP_URI_SCHEME_HTTPS
provide the
interned values for "http" and "https" and can be compared against
URI scheme
values.
user
and password
are parsed as defined in the older URI specs
(ie, separated by a colon; RFC 3986 only talks about a single
"userinfo" field). Note that password
is not included in the
output of uRIToString
. libsoup does not normally use these
fields; authentication is handled via Session
signals.
host
contains the hostname, and port
the port specified in the
URI. If the URI doesn't contain a hostname, host
will be Nothing
,
and if it doesn't specify a port, port
may be 0. However, for
"http" and "https" URIs, host
is guaranteed to be non-Nothing
(trying to parse an http URI with no host
will return Nothing
), and
port
will always be non-0 (because libsoup knows the default value
to use when it is not specified in the URI).
path
is always non-Nothing
. For http/https URIs, path
will never be
an empty string either; if the input URI has no path, the parsed
URI
will have a path
of "/".
query
and fragment
are optional for all URI types.
formDecode
may be useful for parsing query
.
Note that path
, query
, and fragment
may contain
%<!-- -->-encoded characters. uRINew
calls
uriNormalize
on them, but not uriDecode
. This is
necessary to ensure that uRIToString
will generate a URI
that has exactly the same meaning as the original. (In theory,
URI
should leave user
, password
, and host
partially-encoded
as well, but this would be more annoying than useful.)
- newtype URI = URI (ManagedPtr URI)
- newZeroURI :: MonadIO m => m URI
- noURI :: Maybe URI
- data URICopyMethodInfo
- uRICopy :: (HasCallStack, MonadIO m) => URI -> m URI
- data URICopyHostMethodInfo
- uRICopyHost :: (HasCallStack, MonadIO m) => URI -> m URI
- uRIDecode :: (HasCallStack, MonadIO m) => Text -> m Text
- uRIEncode :: (HasCallStack, MonadIO m) => Text -> Maybe Text -> m Text
- data URIEqualMethodInfo
- uRIEqual :: (HasCallStack, MonadIO m) => URI -> URI -> m Bool
- data URIFreeMethodInfo
- uRIFree :: (HasCallStack, MonadIO m) => URI -> m ()
- data URIGetFragmentMethodInfo
- uRIGetFragment :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetHostMethodInfo
- uRIGetHost :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetPasswordMethodInfo
- uRIGetPassword :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetPathMethodInfo
- uRIGetPath :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetPortMethodInfo
- uRIGetPort :: (HasCallStack, MonadIO m) => URI -> m Word32
- data URIGetQueryMethodInfo
- uRIGetQuery :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetSchemeMethodInfo
- uRIGetScheme :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIGetUserMethodInfo
- uRIGetUser :: (HasCallStack, MonadIO m) => URI -> m Text
- data URIHostEqualMethodInfo
- uRIHostEqual :: (HasCallStack, MonadIO m) => URI -> URI -> m Bool
- data URIHostHashMethodInfo
- uRIHostHash :: (HasCallStack, MonadIO m) => URI -> m Word32
- uRINew :: (HasCallStack, MonadIO m) => Maybe Text -> m (Maybe URI)
- data URINewWithBaseMethodInfo
- uRINewWithBase :: (HasCallStack, MonadIO m) => URI -> Text -> m URI
- uRINormalize :: (HasCallStack, MonadIO m) => Text -> Maybe Text -> m Text
- data URISetFragmentMethodInfo
- uRISetFragment :: (HasCallStack, MonadIO m) => URI -> Maybe Text -> m ()
- data URISetHostMethodInfo
- uRISetHost :: (HasCallStack, MonadIO m) => URI -> Maybe Text -> m ()
- data URISetPasswordMethodInfo
- uRISetPassword :: (HasCallStack, MonadIO m) => URI -> Maybe Text -> m ()
- data URISetPathMethodInfo
- uRISetPath :: (HasCallStack, MonadIO m) => URI -> Text -> m ()
- data URISetPortMethodInfo
- uRISetPort :: (HasCallStack, MonadIO m) => URI -> Word32 -> m ()
- data URISetQueryMethodInfo
- uRISetQuery :: (HasCallStack, MonadIO m) => URI -> Maybe Text -> m ()
- data URISetQueryFromFormMethodInfo
- uRISetQueryFromForm :: (HasCallStack, MonadIO m) => URI -> Map Text Text -> m ()
- data URISetSchemeMethodInfo
- uRISetScheme :: (HasCallStack, MonadIO m) => URI -> Text -> m ()
- data URISetUserMethodInfo
- uRISetUser :: (HasCallStack, MonadIO m) => URI -> Maybe Text -> m ()
- data URIToStringMethodInfo
- uRIToString :: (HasCallStack, MonadIO m) => URI -> Bool -> m Text
- data URIUsesDefaultPortMethodInfo
- uRIUsesDefaultPort :: (HasCallStack, MonadIO m) => URI -> m Bool
- clearURIFragment :: MonadIO m => URI -> m ()
- getURIFragment :: MonadIO m => URI -> m (Maybe Text)
- setURIFragment :: MonadIO m => URI -> CString -> m ()
- uRI_fragment :: AttrLabelProxy "fragment"
- clearURIHost :: MonadIO m => URI -> m ()
- getURIHost :: MonadIO m => URI -> m (Maybe Text)
- setURIHost :: MonadIO m => URI -> CString -> m ()
- uRI_host :: AttrLabelProxy "host"
- clearURIPassword :: MonadIO m => URI -> m ()
- getURIPassword :: MonadIO m => URI -> m (Maybe Text)
- setURIPassword :: MonadIO m => URI -> CString -> m ()
- uRI_password :: AttrLabelProxy "password"
- clearURIPath :: MonadIO m => URI -> m ()
- getURIPath :: MonadIO m => URI -> m (Maybe Text)
- setURIPath :: MonadIO m => URI -> CString -> m ()
- uRI_path :: AttrLabelProxy "path"
- getURIPort :: MonadIO m => URI -> m Word32
- setURIPort :: MonadIO m => URI -> Word32 -> m ()
- uRI_port :: AttrLabelProxy "port"
- clearURIQuery :: MonadIO m => URI -> m ()
- getURIQuery :: MonadIO m => URI -> m (Maybe Text)
- setURIQuery :: MonadIO m => URI -> CString -> m ()
- uRI_query :: AttrLabelProxy "query"
- clearURIScheme :: MonadIO m => URI -> m ()
- getURIScheme :: MonadIO m => URI -> m (Maybe Text)
- setURIScheme :: MonadIO m => URI -> CString -> m ()
- uRI_scheme :: AttrLabelProxy "scheme"
- clearURIUser :: MonadIO m => URI -> m ()
- getURIUser :: MonadIO m => URI -> m (Maybe Text)
- setURIUser :: MonadIO m => URI -> CString -> m ()
- uRI_user :: AttrLabelProxy "user"
Exported types
URI (ManagedPtr URI) |
Methods
copy
data URICopyMethodInfo Source #
((~) * signature (m URI), MonadIO m) => MethodInfo * URICopyMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m URI | Returns: a copy of |
Copies uri
copyHost
data URICopyHostMethodInfo Source #
((~) * signature (m URI), MonadIO m) => MethodInfo * URICopyHostMethodInfo URI signature Source # | |
Makes a copy of uri
, considering only the protocol, host, and port
Since: 2.28
decode
:: (HasCallStack, MonadIO m) | |
=> Text |
|
-> m Text | Returns: the decoded URI part. |
encode
:: (HasCallStack, MonadIO m) | |
=> Text |
|
-> Maybe Text |
|
-> m Text | Returns: the encoded URI part |
This %<!-- -->-encodes the given URI part and returns the escaped version in allocated memory, which the caller must free when it is done.
equal
data URIEqualMethodInfo Source #
((~) * signature (URI -> m Bool), MonadIO m) => MethodInfo * URIEqualMethodInfo URI signature Source # | |
Tests whether or not uri1
and uri2
are equal in all parts
free
data URIFreeMethodInfo Source #
((~) * signature (m ()), MonadIO m) => MethodInfo * URIFreeMethodInfo URI signature Source # | |
getFragment
data URIGetFragmentMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetFragmentMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's fragment.
Since: 2.32
getHost
data URIGetHostMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetHostMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's host.
Since: 2.32
getPassword
data URIGetPasswordMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetPasswordMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's password.
Since: 2.32
getPath
data URIGetPathMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetPathMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's path.
Since: 2.32
getPort
data URIGetPortMethodInfo Source #
((~) * signature (m Word32), MonadIO m) => MethodInfo * URIGetPortMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Word32 | Returns: |
Gets uri
's port.
Since: 2.32
getQuery
data URIGetQueryMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetQueryMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's query.
Since: 2.32
getScheme
data URIGetSchemeMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetSchemeMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's scheme.
Since: 2.32
getUser
data URIGetUserMethodInfo Source #
((~) * signature (m Text), MonadIO m) => MethodInfo * URIGetUserMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> m Text | Returns: |
Gets uri
's user.
Since: 2.32
hostEqual
data URIHostEqualMethodInfo Source #
((~) * signature (URI -> m Bool), MonadIO m) => MethodInfo * URIHostEqualMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI | |
-> URI | |
-> m Bool | Returns: whether or not the URIs are equal in scheme, host, and port. |
Compares v1
and v2
, considering only the scheme, host, and port.
Since: 2.28
hostHash
data URIHostHashMethodInfo Source #
((~) * signature (m Word32), MonadIO m) => MethodInfo * URIHostHashMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI | |
-> m Word32 | Returns: a hash |
Hashes key
, considering only the scheme, host, and port.
Since: 2.28
new
:: (HasCallStack, MonadIO m) | |
=> Maybe Text |
|
-> m (Maybe URI) | Returns: a |
Parses an absolute URI.
You can also pass Nothing
for uriString
if you want to get back an
"empty" URI
that you can fill in by hand. (You will need to
call at least uRISetScheme
and uRISetPath
, since
those fields are required.)
newWithBase
data URINewWithBaseMethodInfo Source #
((~) * signature (Text -> m URI), MonadIO m) => MethodInfo * URINewWithBaseMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Text |
|
-> m URI | Returns: a parsed |
Parses uriString
relative to base
.
normalize
:: (HasCallStack, MonadIO m) | |
=> Text |
|
-> Maybe Text |
|
-> m Text | Returns: the normalized URI part |
%<!-- -->-decodes any "unreserved" characters (or characters in
unescapeExtra
) in part
, and %<!-- -->-encodes any non-ASCII
characters, spaces, and non-printing characters in part
.
"Unreserved" characters are those that are not allowed to be used
for punctuation according to the URI spec. For example, letters are
unreserved, so uriNormalize
will turn
<literal>http://example.com/foo/b%<!-- -->61r</literal> into
<literal>http://example.com/foo/bar</literal>, which is guaranteed
to mean the same thing. However, "/" is "reserved", so
<literal>http://example.com/foo%<!-- -->2Fbar</literal> would not
be changed, because it might mean something different to the
server.
In the past, this would return Nothing
if part
contained invalid
percent-encoding, but now it just ignores the problem (as
uRINew
already did).
setFragment
data URISetFragmentMethodInfo Source #
((~) * signature (Maybe Text -> m ()), MonadIO m) => MethodInfo * URISetFragmentMethodInfo URI signature Source # | |
Sets uri
's fragment to fragment
.
setHost
data URISetHostMethodInfo Source #
((~) * signature (Maybe Text -> m ()), MonadIO m) => MethodInfo * URISetHostMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Maybe Text |
|
-> m () |
Sets uri
's host to host
.
If host
is an IPv6 IP address, it should not include the brackets
required by the URI syntax; they will be added automatically when
converting uri
to a string.
http and https URIs should not have a Nothing
host
.
setPassword
data URISetPasswordMethodInfo Source #
((~) * signature (Maybe Text -> m ()), MonadIO m) => MethodInfo * URISetPasswordMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Maybe Text |
|
-> m () |
Sets uri
's password to password
.
setPath
data URISetPathMethodInfo Source #
((~) * signature (Text -> m ()), MonadIO m) => MethodInfo * URISetPathMethodInfo URI signature Source # | |
Sets uri
's path to path
.
setPort
data URISetPortMethodInfo Source #
((~) * signature (Word32 -> m ()), MonadIO m) => MethodInfo * URISetPortMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Word32 |
|
-> m () |
Sets uri
's port to port
. If port
is 0, uri
will not have an
explicitly-specified port.
setQuery
data URISetQueryMethodInfo Source #
((~) * signature (Maybe Text -> m ()), MonadIO m) => MethodInfo * URISetQueryMethodInfo URI signature Source # | |
Sets uri
's query to query
.
setQueryFromForm
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Map Text Text |
|
-> m () |
Sets uri
's query to the result of encoding form
according to the
HTML form rules. See formEncodeHash
for more information.
setScheme
data URISetSchemeMethodInfo Source #
((~) * signature (Text -> m ()), MonadIO m) => MethodInfo * URISetSchemeMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Text |
|
-> m () |
Sets uri
's scheme to scheme
. This will also set uri
's port to
the default port for scheme
, if known.
setUser
data URISetUserMethodInfo Source #
((~) * signature (Maybe Text -> m ()), MonadIO m) => MethodInfo * URISetUserMethodInfo URI signature Source # | |
Sets uri
's user to user
.
toString
data URIToStringMethodInfo Source #
((~) * signature (Bool -> m Text), MonadIO m) => MethodInfo * URIToStringMethodInfo URI signature Source # | |
:: (HasCallStack, MonadIO m) | |
=> URI |
|
-> Bool |
|
-> m Text | Returns: a string representing |
Returns a string representing uri
.
If justPathAndQuery
is True
, this concatenates the path and query
together. That is, it constructs the string that would be needed in
the Request-Line of an HTTP request for uri
.
Note that the output will never contain a password, even if uri
does.
usesDefaultPort
data URIUsesDefaultPortMethodInfo Source #
((~) * signature (m Bool), MonadIO m) => MethodInfo * URIUsesDefaultPortMethodInfo URI signature Source # | |
Tests if uri
uses the default port for its scheme. (Eg, 80 for
http.) (This only works for http, https and ftp; libsoup does not know
the default ports of other protocols.)
Properties
fragment
clearURIFragment :: MonadIO m => URI -> m () Source #
uRI_fragment :: AttrLabelProxy "fragment" Source #
host
clearURIHost :: MonadIO m => URI -> m () Source #
uRI_host :: AttrLabelProxy "host" Source #
password
clearURIPassword :: MonadIO m => URI -> m () Source #
uRI_password :: AttrLabelProxy "password" Source #
path
clearURIPath :: MonadIO m => URI -> m () Source #
uRI_path :: AttrLabelProxy "path" Source #
port
uRI_port :: AttrLabelProxy "port" Source #
query
clearURIQuery :: MonadIO m => URI -> m () Source #
uRI_query :: AttrLabelProxy "query" Source #
scheme
clearURIScheme :: MonadIO m => URI -> m () Source #
uRI_scheme :: AttrLabelProxy "scheme" Source #
user
clearURIUser :: MonadIO m => URI -> m () Source #
uRI_user :: AttrLabelProxy "user" Source #