Data Structures | Defines | Typedefs | Enumerations | Functions

uri.h File Reference

#include <sys/param.h>
#include "UpnpGlobal.h"
#include "UpnpInet.h"
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <arpa/inet.h>
#include <netdb.h>
Include dependency graph for uri.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  TOKEN
 Buffer used in parsinghttp messages, urls, etc. generally this simply holds a pointer into a larger array. More...
struct  HOSTPORT
 Represents a host port: e.g. "127.127.0.1:80" text is a token pointing to the full string representation. More...
struct  URI
 Represents a URI used in parse_uri and elsewhere. More...
struct  URL_LIST
 Represents a list of URLs as in the "callback" header of SUBSCRIBE message in GENA. "char *" URLs holds dynamic memory. More...

Defines

#define HTTP_DATE_LENGTH   37
#define SEPARATORS   "()<>@,;:\\\"/[]?={} \t"
#define MARK   "-_.!~*'()"
#define RESERVED   ";/?:@&=+$,{}"
#define HTTP_SUCCESS   1
#define FALSE   0
#define TAB   9
#define CR   13
#define LF   10
#define SOCKET_BUFFER_SIZE   5000

Typedefs

typedef struct TOKEN token
 Buffer used in parsinghttp messages, urls, etc. generally this simply holds a pointer into a larger array.
typedef struct HOSTPORT hostport_type
 Represents a host port: e.g. "127.127.0.1:80" text is a token pointing to the full string representation.
typedef struct URI uri_type
 Represents a URI used in parse_uri and elsewhere.
typedef struct URL_LIST URL_list
 Represents a list of URLs as in the "callback" header of SUBSCRIBE message in GENA. "char *" URLs holds dynamic memory.

Enumerations

enum  hostType { HOSTNAME, IPv4address }
enum  pathType { ABS_PATH, REL_PATH, OPAQUE_PART }
enum  uriType { ABSOLUTE, RELATIVE }

Functions

int replace_escaped (char *in, int index, size_t *max)
 Replaces an escaped sequence with its unescaped version as in http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs).
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, 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.
int parse_hostport (const char *in, int max, 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.
int remove_escaped_chars (char *in, size_t *size)
 Removes http escaped characters such as: "%20" and replaces them with their character representation. i.e. "hello%20foo" -> "hello foo".
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, int 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, int max, uri_type *out)
 Same as parse_uri(), except that all strings are unescaped (XX replaced by chars).
int parse_token (char *in, token *out, int max_size)

Detailed Description


Typedef Documentation

typedef struct HOSTPORT hostport_type

Represents a host port: e.g. "127.127.0.1:80" text is a token pointing to the full string representation.

typedef struct TOKEN token

Buffer used in parsinghttp messages, urls, etc. generally this simply holds a pointer into a larger array.

typedef struct URI uri_type

Represents a URI used in parse_uri and elsewhere.

typedef struct URL_LIST URL_list

Represents a list of URLs as in the "callback" header of SUBSCRIBE message in GENA. "char *" URLs holds dynamic memory.


Function Documentation

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] in Source URL list.
[out] out Destination URL list.

References copy_token(), URL_LIST::parsedURLs, URL_LIST::size, HOSTPORT::text, 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] list URL list object.

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

Referenced by freeSubscription().

int parse_hostport ( const char *  in,
int  max,
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.

Uses gethostbyname.

Parameters:
[in] in String of characters representing host and port.
[in] max Sets a maximum limit.
[out] out Output parameter where the host and port are represented as an internet address.

References gIF_INDEX, and HOSTPORT::text.

Referenced by parse_uri().

int parse_token ( char *  in,
token out,
int  max_size 
)
Returns:
Parameters:
[in] in .
[out] out .
[in] max_size .
int parse_uri ( const char *  in,
int  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] in Character string containing uri information to be parsed.
[in] max Maximum limit on the number of characters.
[out] out Output parameter which will have the parsed uri information.

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

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

int parse_uri_and_unescape ( char *  in,
int  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] in Character string containing uri information to be parsed.
[in] max Maximum limit on the number of characters.
[out] out Output parameter which will have the parsed uri information.

References parse_uri(), and remove_escaped_chars().

void print_token ( token in  ) 

Function useful in debugging for printing a token.

Parameters:
[in] in Token object to print.

References PRIzu.

Referenced by print_uri().

void print_uri ( uri_type in  ) 

Function useful in debugging for printing a parsed uri.

Parameters:
[in] in URI 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] in String of characters from which "dots" have to be removed.
[in] size Size limit for the number of characters.

References UpnpPrintf().

Referenced by resolve_rel_url().

int remove_escaped_chars ( char *  in,
size_t *  size 
)

Removes http escaped characters such as: "%20" and replaces them with their character representation. i.e. "hello%20foo" -> "hello foo".

The input IS MODIFIED in place (shortened). Extra characters are replaced with NULL.

Returns:
UPNP_E_SUCCESS.
Parameters:
[in,out] in String of characters to be modified.
[in,out] size Size limit for the number of characters.

Referenced by parse_uri_and_unescape().

int replace_escaped ( char *  in,
int  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] in String of characters.
[in] index Index 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_url Base URL.
[in] rel_url Relative URL.

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

Referenced by UpnpResolveURL().

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] in1 First token object whose buffer is to be compared.
[in] in2 Second token object used for the comparison.

Referenced by FindServiceControlURLPath(), and FindServiceEventURLPath().

int token_string_casecmp ( token in1,
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] in1 Token object whose buffer is to be compared.
[in] in2 String of characters to compare with.
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] in1 Token object whose buffer is to be compared.
[in] in2 String of characters to compare with.