#include "config.h"
#include <sofia-sip/su_alloc.h>
#include <sofia-sip/bnf.h>
#include <sofia-sip/hostdomain.h>
#include <sofia-sip/url.h>
#include <sofia-sip/string0.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include <sofia-sip/su_md5.h>
Include dependency graph for url.c:
Defines | |
#define | URL_PARAM_MATCH(p, tag) |
Test if param tag matches to parameter string p. | |
Functions | |
int | url_reserved_p (char const *s) |
Test if string contains url-reserved characters. | |
isize_t | url_esclen (char const *s, char const reserved[]) |
Calculate length of string when escaped. | |
char * | url_escape (char *d, char const *s, char const reserved[]) |
Escape a string. | |
size_t | url_unescape_to (char *d, char const *s, size_t n) |
Unescape characters from string. | |
char * | url_unescape (char *d, char const *s) |
Unescape a string. | |
char const * | url_scheme (enum url_type_e url_type) |
Get URL scheme by type. | |
void | url_init (url_t *url, enum url_type_e type) |
Init a url structure as given type. | |
enum url_type_e | url_get_type (char const *scheme, size_t len) |
Get url type. | |
int | url_d (url_t *url, char *s) |
Decode a URL. | |
issize_t | url_e (char buffer[], isize_t n, url_t const *url) |
Encode a URL. | |
isize_t | url_len (url_t const *url) |
Calculate the encoding length of URL. | |
isize_t | url_xtra (url_t const *url) |
Calculate the size of srings attached to the url. | |
issize_t | url_dup (char *buf, isize_t bufsize, url_t *dst, url_t const *src) |
Duplicate the url in the provided memory area. | |
url_t * | url_hdup (su_home_t *home, url_t const *src) |
Duplicate the url to memory allocated via home. | |
url_t * | url_make (su_home_t *h, char const *str) |
Convert a string to a url struct. | |
url_t * | url_format (su_home_t *h, char const *fmt,...) |
Convert a string formatting result to a url struct. | |
char * | url_as_string (su_home_t *home, url_t const *url) |
Convert url_t to a string allocated from home. | |
isize_t | url_param (char const *params, char const *tag, char value[], isize_t vlen) |
Search for a parameter. | |
isize_t | url_have_param (char const *params, char const *tag) |
Check for a presence of a parameter in string. | |
int | url_has_param (url_t const *url, char const *tag) |
Check for a parameter. | |
int | url_param_add (su_home_t *h, url_t *url, char const *param) |
Add a parameter. | |
char * | url_strip_param_string (char *params, char const *name) |
Strip parameter away from URI. | |
int | url_string_p (url_string_t const *url) |
Test if a pointer to url_string_t is a string (not a pointer to a url_t structure). | |
int | url_is_string (url_string_t const *url) |
Test if a pointer to url_string_t is a string (not a pointer to a url_t structure). | |
int | url_strip_transport (url_t *url) |
Strip transport-specific stuff away from URI. | |
int | url_have_transport (url_t const *url) |
Test if url has any transport-specific stuff. | |
int | url_cmp (url_t const *a, url_t const *b) |
Compare two URLs lazily. | |
int | url_cmp_all (url_t const *a, url_t const *b) |
Compare two URLs conservatively. | |
char const * | url_port_default (enum url_type_e url_type) |
Return default port number corresponding to the url type. | |
char const * | url_tport_default (enum url_type_e url_type) |
Return default transport name corresponding to the url type. | |
char const * | url_port (url_t const *u) |
Return the URL port string, using default port if not present. | |
int | url_sanitize (url_t *url) |
Sanitize a URL. | |
void | url_update (su_md5_t *md5, url_t const *url) |
Update MD5 sum with URL contents. | |
void | url_digest (void *hash, int hsize, url_t const *url, char const *key) |
Calculate a digest from URL contents. | |
char * | url_query_as_header_string (su_home_t *home, char const *query) |
Convert a URL query to a header string. |
char* url_as_string | ( | su_home_t * | home, | |
url_t const * | url | |||
) |
Convert url_t to a string allocated from home.
home | memory home to allocate the new string | |
url | url to convert to string |
Compare two URLs lazily.
Compare essential parts of URLs: schema, host, port, and username.
any_url compares 0 with any other URL.
pres: and im: URIs compares 0 with SIP URIs.
Currently, the url parameters are not compared. This is because the url_cmp() is used to sort URLs: taking parameters into account makes that impossible.
Compare two URLs conservatively.
Compare all parts of URLs.
int url_d | ( | url_t * | url, | |
char * | s | |||
) |
Decode a URL.
This function decodes a URL string to a url_t structure.
url | structure to store the parsing result | |
s | NUL-terminated string to be parsed |
0 | if successful, | |
-1 | otherwise. |
void url_digest | ( | void * | hash, | |
int | hsize, | |||
url_t const * | url, | |||
char const * | key | |||
) |
Calculate a digest from URL contents.
Duplicate the url in the provided memory area.
The function url_dup() copies the url structure src and the strings attached to it to url. The non-constant strings in src are copied to buf. If the size of duplicated strings exceed bufsize, the corresponding string fields in url are set to NULL.
The calling function can calculate the size of buffer required by calling url_dup() with zero as bufsize and NULL as dst.
buf | Buffer for non-constant strings copied from src. | |
bufsize | Size of buf. | |
dst | Destination URL structure. | |
src | Source URL structure. |
issize_t url_e | ( | char | buffer[], | |
isize_t | n, | |||
url_t const * | url | |||
) |
Encode a URL.
The function url_e() combines a URL from substrings in url_t structure according the URL syntax presented above. The encoded url is stored in a buffer of n bytes.
buffer | memory area to store the encoded url. | |
n | size of buffer. | |
url | URL to be encoded. |
char* url_escape | ( | char * | d, | |
char const * | s, | |||
char const | reserved[] | |||
) |
Escape a string.
The function url_escape() copies the string pointed by s to the array pointed by d, excluding the terminating \0 character. All reserved characters in s are copied in hexadecimal format, for instance, "$%#"
is copied as "%24%25%23"
. The destination array d must be large enough to receive the escaped copy.
d | Destination buffer [OUT] | |
s | String to be copied [IN] | |
reserved | Array of reserved characters [IN] |
isize_t url_esclen | ( | char const * | s, | |
char const | reserved[] | |||
) |
Calculate length of string when escaped.
Calculate the length of string s when the excluded or reserved characters in it have been escaped.
s | String with reserved URL characters. [IN | |
reserved | Optional array of reserved characters [IN] |
if (url_reserved_p(s)) { n = malloc(url_esclen(s, NULL) + 1); if (n) url_escape(n, s); } else { n = malloc(strlen(s) + 1); if (n) strcpy(n, s); }
url_t* url_format | ( | su_home_t * | h, | |
char const * | fmt, | |||
... | ||||
) |
Convert a string formatting result to a url struct.
int url_has_param | ( | url_t const * | url, | |
char const * | tag | |||
) |
Check for a parameter.
isize_t url_have_param | ( | char const * | params, | |
char const * | tag | |||
) |
int url_have_transport | ( | url_t const * | url | ) |
Test if url has any transport-specific stuff.
The function url_have_transport() tests if there are transport-specific parameters in a SIP or SIPS URI. These parameters include:
Duplicate the url to memory allocated via home.
The function url_hdup() duplicates (deep copies) an url_t structure. Alternatively, it can be passed a string; string is then copied and parsed to the url_t structure.
The function url_hdup() allocates the destination structure from home as a single memory block. It is possible to free the copied url structure and all the associated strings using a single call to su_free().
home | memory home used to allocate new url object | |
src | pointer to URL (or string) |
int url_is_string | ( | url_string_t const * | url | ) |
Test if a pointer to url_string_t is a string (not a pointer to a url_t structure).
isize_t url_len | ( | url_t const * | url | ) |
Calculate the encoding length of URL.
url_t* url_make | ( | su_home_t * | h, | |
char const * | str | |||
) |
Convert a string to a url struct.
isize_t url_param | ( | char const * | params, | |
char const * | tag, | |||
char | value[], | |||
isize_t | vlen | |||
) |
Search for a parameter.
This function searches for a parameter from a parameter list.
If you want to test if there is parameter user=phone, call this function like
if (url_param(url->url_param, "user=phone", NULL, 0))
params | URL parameter string (excluding first semicolon) | |
tag | parameter name | |
value | string to which the parameter value is copied | |
vlen | length of string reserved for value |
positive | length of parameter value (including final NUL) if found | |
zero | if not found. |
int url_param_add | ( | su_home_t * | h, | |
url_t * | url, | |||
char const * | param | |||
) |
Add a parameter.
char const* url_port | ( | url_t const * | u | ) |
Return the URL port string, using default port if not present.
char const* url_port_default | ( | enum url_type_e | url_type | ) |
Return default port number corresponding to the url type.
char* url_query_as_header_string | ( | su_home_t * | home, | |
char const * | query | |||
) |
Convert a URL query to a header string.
URL query is converted by replacing each "=" in header name "=" value pair with semicolon (":"), and the "&" separating header-name-value pairs with line feed ("\n"). The "body" pseudoheader is moved last in the string. The -escaping is removed. Note that if the query contains 00, the resulting string will be truncated.
home | memory home used to alloate string (if NULL, malloc() it) | |
query | query part from SIP URL |
int url_reserved_p | ( | char const * | s | ) |
Test if string contains url-reserved characters.
s | string to be searched |
0 | if no reserved characters were found. | |
l | if a reserved character was found. |
int url_sanitize | ( | url_t * | url | ) |
Sanitize a URL.
The function url_sanitize() adds a scheme to an incomplete URL. It modifies its parameter structure url. Currently, the function follows simple heuristics:
ftp
. is an FTP URLwww
. is an HTTP URLhost/foo
;bar, is an HTTP URL
url | pointer to URL struct to be sanitized (IN/OUT) |
char const* url_scheme | ( | enum url_type_e | url_type | ) |
Get URL scheme by type.
int url_string_p | ( | url_string_t const * | url | ) |
Test if a pointer to url_string_t is a string (not a pointer to a url_t structure).
char* url_strip_param_string | ( | char * | params, | |
char const * | name | |||
) |
Strip parameter away from URI.
Remove a named parameter and its possible value from the URL parameter string (url_s#url_param).
int url_strip_transport | ( | url_t * | url | ) |
Strip transport-specific stuff away from URI.
The function url_strip_transport() removes transport-specific parameters from a SIP or SIPS URI. These parameters include:
If the parameter string contains empty parameters, they are stripped, too.
char* url_unescape | ( | char * | d, | |
char const * | s | |||
) |
Unescape a string.
Unescape string s to the buffer d, including the terminating \0 character. All -escaped triplets in s are unescaped, for instance, "%40%25%23"
is copied as "@%#"
. The destination array d must be large enough to receive the escaped copy.
d | destination buffer | |
s | string to be copied |
size_t url_unescape_to | ( | char * | d, | |
char const * | s, | |||
size_t | n | |||
) |
Unescape characters from string.
Unescape n characters from string s to the buffer d, including the terminating \0 character. All -escaped triplets in s are unescaped, for instance, "%40%25%23"
is copied as "@%#"
. The destination array d must be large enough to receive the escaped copy (n bytes is always enough).
d | destination buffer | |
s | string to be unescaped | |
n | maximum number of characters to unescape |
isize_t url_xtra | ( | url_t const * | url | ) |
Calculate the size of srings attached to the url.
url | pointer to a url_t structure or string |