URI Dissector
The URI dissector is a helper class to dissect an URI into its different components.
File information
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/bla#funny?cgpn=73&cdpn=123");
debug->printf("%.*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"