# URI Dissector

The URI dissector is a helper class to dissect an URI into its different components.

## File information

File | common/ilib/uri.h
Classes | uri_dissector
Examples | URI dissection

# Classes

## uri_dissector

    class uri_dissector {
    public:

    	char *scheme, *e_scheme;      /* e.g.: http */
    	char *hier, *e_hier;          /* hierarchy e.g.: // */
    	char *usr, *e_usr;            /* user */
    	char *pwd, *e_pwd;            /* password */
    	char *ip, *e_ip;              /* host part is an ip address */
    	char *fqdn, *e_fqdn;          /* host part is a fully qualified domain name */
    	char *port, *e_port;          /* port past ip/fqdn */
    	char *path, *e_path;
    	char *file, *e_file;
    	char *anchor, *e_anchor;      /* eg: #bla */
    	char *query, *e_query;        /* '?' cgi query string */
    	char *params, *e_params;      /* ';' host parameters */

    	uri_dissector();

    	bool dissect_uri(char *uri);
    	bool path_to_argv(char *buf, int sz, int &argc, char * argv[]);
    	bool querystring_to_argv(char *buf, int sz, int &argc, char * argv[]);

    #define COMPOSE_SCHEME  0x01
    #define COMPOSE_HIER    0x02
    #define COMPOSE_USR     0x04
    #define COMPOSE_PWD     0x08
    #define COMPOSE_HOST    0x10
    #define COMPOSE_PORT    0x20
    #define COMPOSE_PATH    0x40
    #define COMPOSE_FILE    0x80
    #define COMPOSE_ANCHOR  0x100
    #define COMPOSE_QUERY   0x200
    #define COMPOSE_PARAMS  0x400

    #define COMPOSE_ALL     0xFFFFFFFF
    #define COMPOSE_ALL_NO_USERPWD COMPOSE_ALL&~COMPOSE_USR&~COMPOSE_PWD

    	char* compose(char *buf, dword len_buf, dword flags = COMPOSE_ALL);
    };

### Overview

The uri_dissector class is used to dissect an URI into its compontents.

### Public functions

uri_dissector
  Creates the uri_dissector instance.
dissect_uri
  Dissects the uri and sets the public variables like scheme, e_scheme etc.

  #### Parameters

  char * uri | The uri which is dissected. The char * buffer is not modified!

  #### Return value

  True if the dissection was successfull, otherwise false.
path_to_argv
Splits the path parts into to argv array.

  #### Parameters

  char * buf | This buffer will be used for the arguments of the argv array.
  int sz | The size of buf.
  int &argc | The initial element count of the argv array. Will contain the actual element count after successfull completion.
  char *argv[] | The array which will contain the different parts of the path

  #### Return value

  True if the buffer was large enough and argv had enough elements. Otherwise false.
querystring_to_argv
Splits the query string into the argv array, while argv[0] is a name and argv[1] is a value and so on.

  #### Parameters

  char * buf | This buffer will be used for the arguments of the argv array.
  int sz | The size of buf.
  int &argc | The initial element count of the argv array. Will contain the actual element count after successfull completion.
  char *argv[] | The array which will contain the different parts of the query. The first element contains the name, the second the value and so on.

  #### Return value

  True if the buffer was large enough and argv had enough elements. Otherwise false.
compose
Writes the different parts from the URI to a buffer. You can use the COMPOSE_* flags to specify the parts you want.

  #### Parameters

  char * buf | This buffer will be used for the arguments of the argv array.
  dword len_buf | The length of buf.
  dword flags | Specifies the parts to compose. The default value is COMPOSE_ALL.

  #### Return value

  Returns buf again.

### Public Members

char * scheme; char * e_scheme | Start and end pointer of the scheme, e.g. http.
char * hier; char * e_hier | Start and end pointer of the hierarchy, e.g. //.
char * usr; char * e_usr | Start and end pointer of the user.
char * pwd; char * e_pwd | Start and end pointer of the password.
char * ip; char * e_ip | Start and end pointer of the IP address.
char * fqdn; char * e_fqdn | Start and end pointer of the domain name (if there is no IP address).
char * port; char * e_port | Start and end pointer of the port.
char * path; char * e_path | Start and end pointer of the path.
char * file; char * e_file | Start and end pointer of the file after the path.
char * anchor; char * e_anchor | Start and end pointer of the anchor, e.g. #test.
char * query; char * e_query | Start and end pointer of the query string, e.g. ?test=123.
char * params; char * e_params | Start and end pointer of the host parameters.

# Code Example

## URI dissection

    uri_dissector uri;
    uri.dissect_uri("http://admin:ip800@172.16.16.43/page.htm?a=1&b=2#fragment");
    debug->iprintf("%.*s", uri.e_user - uri.user, uri.user); // prints "admin"

    char buf[256];
    uri.dissect_uri("sip:1234@anywhere.de:8888;user=phone");
    uri.compose(buf,sizeof(buf),COMPOSE_PARAMS);   // yields "user=phone"
    uri.compose(buf,sizeof(buf),COMPOSE_USR);      // yields "1234"
    uri.compose(buf,sizeof(buf),COMPOSE_HOST);     // yields "anywhere.de"
    uri.compose(buf,sizeof(buf),COMPOSE_PORT);     // yields "8888"