2015-02-09 17:43:24 +11:00
|
|
|
#include "uri.hpp"
|
|
|
|
|
|
|
|
#include "debug.hpp"
|
2015-04-13 16:45:56 +10:00
|
|
|
#include "tap.hpp"
|
2015-02-09 17:43:24 +11:00
|
|
|
|
|
|
|
int
|
|
|
|
main (void)
|
|
|
|
{
|
2018-08-05 14:42:02 +10:00
|
|
|
cruft::TAP::logger tap;
|
2015-09-21 15:36:05 +10:00
|
|
|
|
2015-02-11 16:43:07 +11:00
|
|
|
static const struct {
|
|
|
|
const char *src;
|
2017-12-15 18:57:10 +11:00
|
|
|
|
2015-02-11 16:43:07 +11:00
|
|
|
const char *scheme;
|
2017-12-15 18:57:10 +11:00
|
|
|
const char *hierarchical;
|
2015-02-11 16:43:07 +11:00
|
|
|
const char *authority;
|
2017-12-15 18:57:10 +11:00
|
|
|
const char *user;
|
|
|
|
const char *host;
|
|
|
|
const char *port;
|
2015-02-11 16:43:07 +11:00
|
|
|
const char *path;
|
|
|
|
const char *query;
|
|
|
|
const char *fragment;
|
|
|
|
} GOOD[] = {
|
2017-12-15 18:57:10 +11:00
|
|
|
// examples from rfc3986
|
|
|
|
{
|
|
|
|
.src = "ftp://ftp.is.co.za/rfc/rfc1808.txt",
|
|
|
|
|
|
|
|
.scheme = "ftp",
|
|
|
|
.hierarchical = "ftp.is.co.za/rfc/rfc1808.txt",
|
|
|
|
.authority = "ftp.is.co.za",
|
|
|
|
.user = "",
|
|
|
|
.host = "ftp.is.co.za",
|
|
|
|
.port = "",
|
|
|
|
.path = "/rfc/rfc1808.txt",
|
|
|
|
.query = "",
|
|
|
|
.fragment = "" },
|
|
|
|
{
|
|
|
|
.src = "http://www.ietf.org/rfc/rfc2396.txt",
|
|
|
|
|
|
|
|
.scheme = "http",
|
|
|
|
.hierarchical = "www.ietf.org/rfc/rfc2396.txt",
|
|
|
|
.authority = "www.ietf.org",
|
|
|
|
.user = "",
|
|
|
|
.host = "www.ietf.org",
|
|
|
|
.port = "",
|
|
|
|
.path = "/rfc/rfc2396.txt",
|
|
|
|
.query = "",
|
|
|
|
.fragment = "" },
|
|
|
|
|
|
|
|
{
|
|
|
|
.src = "ldap://[2001:db8::7]/c=GB?objectClass?one",
|
|
|
|
|
|
|
|
.scheme = "ldap",
|
|
|
|
.hierarchical = "[2001:db8::7]/c=GB",
|
|
|
|
.authority = "[2001:db8::7]",
|
|
|
|
.user = "",
|
|
|
|
.host = "[2001:db8::7]",
|
|
|
|
.port = "",
|
|
|
|
.path = "/c=GB",
|
|
|
|
.query = "objectClass?one",
|
|
|
|
.fragment = "" },
|
|
|
|
|
|
|
|
{
|
|
|
|
.src = "mailto:John.Doe@example.com",
|
|
|
|
|
|
|
|
.scheme= "mailto",
|
|
|
|
.hierarchical = "John.Doe@example.com",
|
|
|
|
.authority= "",
|
|
|
|
.user = "",
|
|
|
|
.host = "",
|
|
|
|
.port = "",
|
|
|
|
.path= "John.Doe@example.com",
|
|
|
|
.query= "",
|
|
|
|
.fragment= "" },
|
|
|
|
|
|
|
|
{
|
|
|
|
.src = "news:comp.infosystems.www.servers.unix",
|
|
|
|
.scheme= "news",
|
|
|
|
.hierarchical = "comp.infosystems.www.servers.unix",
|
|
|
|
.authority= "",
|
|
|
|
.user = "",
|
|
|
|
.host = "",
|
|
|
|
.port = "",
|
|
|
|
.path= "comp.infosystems.www.servers.unix",
|
|
|
|
.query= "",
|
|
|
|
.fragment= "" },
|
2015-02-09 17:43:24 +11:00
|
|
|
|
2017-12-15 18:57:10 +11:00
|
|
|
{
|
|
|
|
.src = "tel:+1-816-555-1212",
|
|
|
|
|
|
|
|
.scheme= "tel",
|
|
|
|
.hierarchical = "+1-816-555-1212",
|
|
|
|
.authority= "",
|
|
|
|
.user = "",
|
|
|
|
.host = "",
|
|
|
|
.port = "",
|
|
|
|
.path= "+1-816-555-1212",
|
|
|
|
.query= "",
|
|
|
|
.fragment= "" },
|
|
|
|
|
|
|
|
{
|
|
|
|
.src = "telnet://192.0.2.16:80/",
|
|
|
|
|
|
|
|
.scheme= "telnet",
|
|
|
|
.hierarchical = "192.0.2.16:80/",
|
|
|
|
.authority= "192.0.2.16:80",
|
|
|
|
.user = "",
|
|
|
|
.host = "192.0.2.16",
|
|
|
|
.port = "80",
|
|
|
|
.path= "/",
|
|
|
|
.query= "",
|
|
|
|
.fragment= "" },
|
|
|
|
|
|
|
|
{
|
|
|
|
.src = "urn:oasis:names:specification:docbook:dtd:xml:4.1.2",
|
|
|
|
|
|
|
|
.scheme= "urn",
|
|
|
|
.hierarchical = "oasis:names:specification:docbook:dtd:xml:4.1.2",
|
|
|
|
.authority= "",
|
|
|
|
.user = "",
|
|
|
|
.host = "",
|
|
|
|
.port = "",
|
|
|
|
.path= "oasis:names:specification:docbook:dtd:xml:4.1.2",
|
|
|
|
.query= "",
|
|
|
|
.fragment= "" },
|
|
|
|
|
|
|
|
|
|
|
|
// a case with all possible components
|
|
|
|
{
|
|
|
|
.src = "https://user:password@example.com:80/path/to?foo=bar#fragment",
|
|
|
|
|
|
|
|
.scheme = "https",
|
|
|
|
.hierarchical = "user:password@example.com:80/path/to",
|
|
|
|
.authority = "user:password@example.com:80",
|
|
|
|
.user = "user:password",
|
|
|
|
.host = "example.com",
|
|
|
|
.port = "80",
|
|
|
|
.path = "/path/to",
|
|
|
|
.query = "foo=bar",
|
|
|
|
.fragment = "fragment" },
|
|
|
|
};
|
2015-02-11 16:43:07 +11:00
|
|
|
|
2017-12-15 18:57:10 +11:00
|
|
|
for (auto t: GOOD) {
|
2018-08-05 14:42:02 +10:00
|
|
|
tap.expect_nothrow ([t] (void) { cruft::uri foo (t.src); }, "nothrow parsing '%s'", t.src);
|
|
|
|
cruft::uri u (t.src);
|
2015-02-11 16:43:07 +11:00
|
|
|
|
2017-12-20 12:31:52 +11:00
|
|
|
tap.expect_eq (u.scheme (), t.scheme, "scheme for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.heirarchical (), t.hierarchical, "hierarchical for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.authority (), t.authority, "authority for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.host (), t.host, "host for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.user (), t.user, "user for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.port (), t.port, "port for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.path (), t.path, "path for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.query (), t.query, "query for '%s'", t.src);
|
|
|
|
tap.expect_eq (u.fragment (), t.fragment, "fragment for '%s'", t.src);
|
2015-02-11 16:43:07 +11:00
|
|
|
}
|
2015-04-13 18:06:08 +10:00
|
|
|
|
2015-02-09 17:43:24 +11:00
|
|
|
static const char* BAD[] = {
|
|
|
|
"www.google.com.au",
|
|
|
|
};
|
|
|
|
|
|
|
|
for (auto i: BAD)
|
2018-08-05 14:42:02 +10:00
|
|
|
tap.expect_throw<cruft::uri::parse_error> (
|
|
|
|
[i] (void) { cruft::uri foo (i); }, "throw parsing '%s'", i
|
2017-12-15 18:57:10 +11:00
|
|
|
);
|
2015-04-13 16:45:56 +10:00
|
|
|
|
2015-09-21 15:36:05 +10:00
|
|
|
|
|
|
|
return tap.status ();
|
2015-02-09 17:43:24 +11:00
|
|
|
}
|