Awesome
uriparser2
Your one-stop C and C++ library for URI parsing.
Why?
There aren't any easy to use libraries right now. The original uriparser[1] works okay but its API is horrendous.
[1] http://uriparser.sourceforge.net/ - uriparser2 uses bits of uriparser but is not affiliated with or endorsed by said library.
Compiling
Build the dynamic and static library:
make all
C usage
uriparser2 exposes a straight-forward API to C client code. An excerpt from uriparser2.h
:
/**
* URI object. After the call to uri_parse() fields will be NULL (0 for the port) if their component was absent in the input string.
*/
typedef struct {
const char *scheme;
const char *user;
const char *pass;
const char *host;
unsigned short port;
const char *path;
const char *query;
const char *fragment;
} URI;
/**
* Parse URI into its components.
*
* @param uri The URI to parse.
* @return URI object. The caller is responsible for freeing this object. NULL is returned on parse error or out-of-memory conditions (in the latter case errno=ENOMEM).
*/
URI *uri_parse(const char *uri);
/**
* Create string representation of URI object.
*
* @param uri URI object.
* @return URI as a string. The caller is responsible for freeing this object. NULL is returned on out-of-memory conditions (errno=ENOMEM).
*/
char *uri_build(const URI *uri);
/**
* Compare two URI objects. Follows the strcmp() contract. The order in which components are compared is as follows: scheme, host, port, path, query, fragment, user, pass.
* NULL components are always smaller than their non-NULL counterparts. That is, a < b if a->scheme == NULL and b->scheme != NULL.
*
* @param a First URI object.
* @param b Second URI object.
* @return -1 if a < b, 0 if a == b, 1 if a > b.
*/
int uri_compare(const URI *a, const URI *b);
Example:
URI *uri = uri_parse("http://github.com/bnoordhuis/uriparser2");
char *s = uri_build(uri);
printf("uri=%s, host=%s, path=%s\n", s, uri->host, uri->path);
free(s);
free(uri);
C++ usage
An idiomatic RAII class is exposed to C++ client code:
typedef struct URI {
const char *scheme;
const char *user;
const char *pass;
const char *host;
unsigned short port;
const char *path;
const char *query;
const char *fragment;
URI(const char *uri = 0);
~URI();
bool operator<(const URI& uri) const;
bool operator>(const URI& uri) const;
bool operator<=(const URI& uri) const;
bool operator>=(const URI& uri) const;
bool operator==(const URI& uri) const;
bool operator!=(const URI& uri) const;
std::string to_string() const;
} URI;
Example:
URI uri("http://github.com/bnoordhuis/uriparser2");
std::cout << "uri=" << uri << ", host=" << uri->host << ", path=" << uri->path << std::endl;
License
uriparser2 is MIT-licensed. The bits from the original uriparser - http://uriparser.sourceforge.net/ - are BSD-licensed.