libUPnP  1.6.17
Functions
uri.c File Reference

Contains functions for uri, url parsing utility. More...

#include <assert.h>
#include "config.h"
#include "uri.h"
#include "upnpapi.h"
Include dependency graph for uri.c:

Functions

static int is_reserved (char in)
 Returns a 1 if a char is a RESERVED char as defined in http://www.ietf.org/rfc/rfc2396.txt RFC explaining URIs).
int is_mark (char in)
 Returns a 1 if a char is a MARK char as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
int is_unreserved (char in)
 Returns a 1 if a char is an UNRESERVED char as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
int is_escaped (const char *in)
 Returns a 1 if a char[3] sequence is ESCAPED as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
int replace_escaped (char *in, size_t index, size_t *max)
 Replaces an escaped sequence with its unescaped version as in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs)
static size_t parse_uric (const char *in, size_t max, token *out)
 Parses a string of uric characters starting at in[0] as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
static void copy_token (const token *in, const char *in_base, token *out, char *out_base)
 Tokens are generally pointers into other strings. This copies the offset and size from a token (in) relative to one string (in_base) into a token (out) relative to another string (out_base).
int copy_URL_list (URL_list *in, URL_list *out)
 Copies one URL_list into another.
void free_URL_list (URL_list *list)
 Frees the memory associated with a URL_list.
void print_uri (uri_type *in)
 Function useful in debugging for printing a parsed uri.
void print_token (token *in)
 Function useful in debugging for printing a token.
int token_string_casecmp (token *in1, const char *in2)
 Compares buffer in the token object with the buffer in in2.
int token_string_cmp (token *in1, char *in2)
 Compares a null terminated string to a token (exact).
int token_cmp (token *in1, token *in2)
 Compares two tokens.
static int parse_hostport (const char *in, hostport_type *out)
 Parses a string representing a host and port (e.g. "127.127.0.1:80" or "localhost") and fills out a hostport_type struct with internet address and a token representing the full host and port.
static size_t parse_scheme (const char *in, size_t max, token *out)
 parses a uri scheme starting at in[0] as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
int remove_escaped_chars (INOUT char *in, INOUT size_t *size)
int remove_dots (char *in, size_t size)
 Removes ".", and ".." from a path.
char * resolve_rel_url (char *base_url, char *rel_url)
 resolves a relative url with a base url returning a NEW (dynamically allocated with malloc) full url.
int parse_uri (const char *in, size_t max, uri_type *out)
 Parses a uri as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
int parse_uri_and_unescape (char *in, size_t max, uri_type *out)
 Same as parse_uri(), except that all strings are unescaped (XX replaced by chars).

Detailed Description

Contains functions for uri, url parsing utility.


Function Documentation

static void copy_token ( const token in,
const char *  in_base,
token out,
char *  out_base 
) [static]

Tokens are generally pointers into other strings. This copies the offset and size from a token (in) relative to one string (in_base) into a token (out) relative to another string (out_base).

Parameters:
[in]inSource token.
[in]in_base.
[out]outDestination token.
[in]out_base.

Referenced by copy_URL_list().

int copy_URL_list ( URL_list in,
URL_list out 
)

Copies one URL_list into another.

This includes dynamically allocating the out->URLs field (the full string), and the structures used to hold the parsedURLs. This memory MUST be freed by the caller through: free_URL_list(&out).

Returns:
  • HTTP_SUCCESS - On Success.
  • UPNP_E_OUTOF_MEMORY - On Failure to allocate memory.
Parameters:
[in]inSource URL list.
[out]outDestination URL list.

References copy_token(), URL_LIST::parsedURLs, URL_LIST::size, HOSTPORT::text, UPNP_E_OUTOF_MEMORY, and URL_LIST::URLs.

Referenced by copy_subscription().

void free_URL_list ( URL_list list)

Frees the memory associated with a URL_list.

Frees the dynamically allocated members of of list. Does NOT free the pointer to the list itself ( i.e. does NOT free(list)).

Parameters:
[in]listURL list object.

References URL_LIST::parsedURLs, URL_LIST::size, and URL_LIST::URLs.

Referenced by freeSubscription().

int is_escaped ( const char *  in)

Returns a 1 if a char[3] sequence is ESCAPED as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

Size of array is NOT checked (MUST be checked by caller).

Returns:
1 if char is a ESCAPED char.
Parameters:
[in]inChar sequence to be matched for ESCAPED characters.

Referenced by parse_uric().

int is_mark ( char  in)

Returns a 1 if a char is a MARK char as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

Returns:
1 if char is a MARKED char.
Parameters:
[in]inChar to be matched for MARKED characters.

Referenced by is_unreserved().

static int is_reserved ( char  in) [static]

Returns a 1 if a char is a RESERVED char as defined in http://www.ietf.org/rfc/rfc2396.txt RFC explaining URIs).

Returns:
1 if char is a RESERVED char.
Parameters:
[in]inChar to be matched for RESERVED characters.

References RESERVED.

Referenced by parse_uric().

int is_unreserved ( char  in)

Returns a 1 if a char is an UNRESERVED char as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

Returns:
1 if char is a UNRESERVED char.
Parameters:
[in]inChar to be matched for UNRESERVED characters.

References is_mark().

Referenced by parse_uric().

static int parse_hostport ( const char *  in,
hostport_type out 
) [static]

Parses a string representing a host and port (e.g. "127.127.0.1:80" or "localhost") and fills out a hostport_type struct with internet address and a token representing the full host and port.

Uses gethostbyname.

Parameters:
[in]inString of characters representing host and port.
[out]outOutput parameter where the host and port are represented as an internet address.

References gIF_INDEX, HOSTPORT::text, and UPNP_E_INVALID_URL.

Referenced by parse_uri().

static size_t parse_scheme ( const char *  in,
size_t  max,
token out 
) [static]

parses a uri scheme starting at in[0] as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

(e.g. "http:" -> scheme= "http").

Note:
String MUST include ':' within the max charcters.
Returns:
Parameters:
[in]inString of characters representing a scheme.
[in]maxMaximum number of characters.
[out]outOutput parameter whose buffer is filled in with the scheme.

Referenced by parse_uri().

int parse_uri ( const char *  in,
size_t  max,
uri_type out 
)

Parses a uri as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

Handles absolute, relative, and opaque uris. Parses into the following pieces: scheme, hostport, pathquery, fragment (path and query are treated as one token)

Caller should check for the pieces they require.

Returns:
Parameters:
[in]inCharacter string containing uri information to be parsed.
[in]maxMaximum limit on the number of characters.
[out]outOutput parameter which will have the parsed uri information.

References parse_hostport(), parse_scheme(), and parse_uric().

Referenced by Check_Connect_And_Wait_Connection(), create_url_list(), FindServiceControlURLPath(), FindServiceEventURLPath(), parse_uri_and_unescape(), and resolve_rel_url().

int parse_uri_and_unescape ( char *  in,
size_t  max,
uri_type out 
)

Same as parse_uri(), except that all strings are unescaped (XX replaced by chars).

Note:
This modifies 'pathquery' and 'fragment' parts of the input.
Returns:
Parameters:
[in]inCharacter string containing uri information to be parsed.
[in]maxMaximum limit on the number of characters.
[out]outOutput parameter which will have the parsed uri information.

References parse_uri(), and remove_escaped_chars().

static size_t parse_uric ( const char *  in,
size_t  max,
token out 
) [static]

Parses a string of uric characters starting at in[0] as defined in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).

Returns:
Parameters:
[in]inString of characters.
[in]maxMaximum limit.
[out]outToken object where the string of characters is copied.

References is_escaped(), is_reserved(), and is_unreserved().

Referenced by parse_uri().

void print_token ( token in)

Function useful in debugging for printing a token.

Parameters:
[in]inToken object to print.

Referenced by print_uri().

void print_uri ( uri_type in)

Function useful in debugging for printing a parsed uri.

Parameters:
[in]inURI object to print.

References print_token(), and HOSTPORT::text.

int remove_dots ( char *  in,
size_t  size 
)

Removes ".", and ".." from a path.

If a ".." can not be resolved (i.e. the .. would go past the root of the path) an error is returned.

The input IS modified in place.)

Note:
Examples char path[30]="/../hello"; remove_dots(path, strlen(path)) -> UPNP_E_INVALID_URL char path[30]="/./hello"; remove_dots(path, strlen(path)) -> UPNP_E_SUCCESS, in = "/hello" char path[30]="/./hello/foo/../goodbye" -> UPNP_E_SUCCESS, in = "/hello/goodbye"
Returns:
  • UPNP_E_SUCCESS - On Success.
  • UPNP_E_OUTOF_MEMORY - On failure to allocate memory.
  • UPNP_E_INVALID_URL - Failure to resolve URL.
Parameters:
[in]inString of characters from which "dots" have to be removed.
[in]sizeSize limit for the number of characters.

References UPNP_E_INVALID_URL, UPNP_E_OUTOF_MEMORY, UPNP_E_SUCCESS, and UpnpPrintf().

Referenced by process_request(), and resolve_rel_url().

int replace_escaped ( char *  in,
size_t  index,
size_t *  max 
)

Replaces an escaped sequence with its unescaped version as in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs)

Size of array is NOT checked (MUST be checked by caller)

Note:
This function modifies the string. If the sequence is an escaped sequence it is replaced, the other characters in the string are shifted over, and NULL characters are placed at the end of the string.
Returns:
Parameters:
[in,out]inString of characters.
[in]indexIndex at which to start checking the characters.
[out]max.
char* resolve_rel_url ( char *  base_url,
char *  rel_url 
)

resolves a relative url with a base url returning a NEW (dynamically allocated with malloc) full url.

If the base_url is NULL, then a copy of the rel_url is passed back if the rel_url is absolute then a copy of the rel_url is passed back if neither the base nor the rel_url are Absolute then NULL is returned. Otherwise it tries and resolves the relative url with the base as described in http://www.ietf.org/rfc/rfc2396.txt (RFCs explaining URIs).

The resolution of '..' is NOT implemented, but '.' is resolved.

Returns:
Parameters:
[in]base_urlBase URL.
[in]rel_urlRelative URL.

References parse_uri(), remove_dots(), HOSTPORT::text, and UPNP_E_SUCCESS.

Referenced by UpnpResolveURL(), and UpnpResolveURL2().

int token_cmp ( token in1,
token in2 
)

Compares two tokens.

Returns:
  • < 0, if string1 is less than string2.
  • == 0, if string1 is identical to string2 .
  • > 0, if string1 is greater than string2.
Parameters:
[in]in1First token object whose buffer is to be compared.
[in]in2Second token object used for the comparison.

Referenced by FindServiceControlURLPath(), and FindServiceEventURLPath().

int token_string_casecmp ( token in1,
const char *  in2 
)

Compares buffer in the token object with the buffer in in2.

Returns:
  • < 0, if string1 is less than string2.
  • == 0, if string1 is identical to string2 .
  • > 0, if string1 is greater than string2.
Parameters:
[in]in1Token object whose buffer is to be compared.
[in]in2String of characters to compare with.

Referenced by Check_Connect_And_Wait_Connection().

int token_string_cmp ( token in1,
char *  in2 
)

Compares a null terminated string to a token (exact).

Returns:
  • < 0, if string1 is less than string2.
  • == 0, if string1 is identical to string2 .
  • > 0, if string1 is greater than string2.
Parameters:
[in]in1Token object whose buffer is to be compared.
[in]in2String of characters to compare with.