Merge pull request #13804 from chrysn-pull-requests/uri-test-isabsolute

uri_parser: Fix and test non-relative recognition
This commit is contained in:
Cenk Gündoğan 2020-04-05 13:42:11 +02:00 committed by GitHub
commit abd399b934
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 6 deletions

View File

@ -219,6 +219,17 @@ bool uri_parser_is_absolute(const char *uri, size_t uri_len)
/* relative */ /* relative */
return false; return false;
} }
for (int i = 0; &uri[i] < colon; ++i) {
if (!(((uri[i] >= 'A') && (uri[i] <= 'Z')) ||
((uri[i] >= 'a') && (uri[i] <= 'z')) ||
((uri[i] >= '0') && (uri[i] <= '9')) ||
(uri[i] == '+') ||
(uri[i] == '-') ||
(uri[i] == '.'))) {
/* relative */
return false;
}
}
/* absolute */ /* absolute */
return true; return true;

View File

@ -13,6 +13,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdbool.h>
#include "embUnit.h" #include "embUnit.h"
#include "uri_parser.h" #include "uri_parser.h"
@ -20,9 +21,9 @@
#include "unittests-constants.h" #include "unittests-constants.h"
#include "tests-uri_parser.h" #include "tests-uri_parser.h"
#define VEC(u, s, us, h, po, pa, q, e) \ #define VEC(u, f, s, us, h, po, pa, q, e) \
{ .uri = u, .scheme = s, .userinfo = us, .host = h, .port = po, \ { .uri = u, .full_uri = f, .scheme = s, .userinfo = us, .host = h, \
.path = pa, .query = q, .expected = e} .port = po, .path = pa, .query = q, .expected = e}
#define VEC_CHECK(comp, i, vec_msg) \ #define VEC_CHECK(comp, i, vec_msg) \
do { \ do { \
@ -51,6 +52,7 @@
typedef struct { typedef struct {
char uri[64]; char uri[64];
bool full_uri;
char scheme[8]; char scheme[8];
char userinfo[16]; char userinfo[16];
char host[16]; char host[16];
@ -65,9 +67,11 @@ typedef struct {
scheme, userinfo, host, port, scheme, userinfo, host, port,
path, query, expected return value) path, query, expected return value)
*/ */
static const validate_t validate_uris[26] = { static const validate_t validate_uris[27] = {
/* uri to parse */ /* uri to parse */
VEC("coap://RIOT:test@[2001:db8::1]:5683/.well-known/core?v=1", VEC("coap://RIOT:test@[2001:db8::1]:5683/.well-known/core?v=1",
/* is URI */
true,
/* parsed scheme */ /* parsed scheme */
"coap", "coap",
/* parsed userinfo */ /* parsed userinfo */
@ -83,6 +87,7 @@ static const validate_t validate_uris[26] = {
/* expected return value */ /* expected return value */
0), 0),
VEC("/.well-known/core?v=1", VEC("/.well-known/core?v=1",
false,
"", "",
"", "",
"", "",
@ -91,6 +96,7 @@ static const validate_t validate_uris[26] = {
"v=1", "v=1",
0), 0),
VEC("coap://R@[2001:db8::1]:5own/v=1", VEC("coap://R@[2001:db8::1]:5own/v=1",
true,
"coap", "coap",
"R", "R",
"[2001:db8::1]", "[2001:db8::1]",
@ -99,6 +105,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("coap://R@[2001:db8::1]:5own/:v=1", VEC("coap://R@[2001:db8::1]:5own/:v=1",
true,
"coap", "coap",
"R", "R",
"[2001:db8::1]", "[2001:db8::1]",
@ -107,6 +114,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("cap://R@[2001:db8::1]:5own/?v=1", VEC("cap://R@[2001:db8::1]:5own/?v=1",
true,
"cap", "cap",
"R", "R",
"[2001:db8::1]", "[2001:db8::1]",
@ -115,6 +123,7 @@ static const validate_t validate_uris[26] = {
"v=1", "v=1",
0), 0),
VEC("oap://Y2001:db8::1]:5own/av=1", VEC("oap://Y2001:db8::1]:5own/av=1",
true,
"oap", "oap",
"", "",
"Y2001:db8::1]", "Y2001:db8::1]",
@ -123,6 +132,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("//Rb[ʰ00J:d/5v=0", VEC("//Rb[ʰ00J:d/5v=0",
false,
"", "",
"", "",
"", "",
@ -131,6 +141,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("coap://oap://P@[2001:b", VEC("coap://oap://P@[2001:b",
true,
"", "",
"", "",
"", "",
@ -139,6 +150,7 @@ static const validate_t validate_uris[26] = {
"", "",
-1), -1),
VEC("coap:///R@[2008::1]:5own//R@[2008::1]:5own/?v=1", VEC("coap:///R@[2008::1]:5own//R@[2008::1]:5own/?v=1",
true,
"coap", "coap",
"", "",
"", "",
@ -147,6 +159,7 @@ static const validate_t validate_uris[26] = {
"v=1", "v=1",
0), 0),
VEC("coaP://R/RZ[2001[8:01[8::1]:5o:1]:5oTMv=1", VEC("coaP://R/RZ[2001[8:01[8::1]:5o:1]:5oTMv=1",
true,
"coaP", "coaP",
"", "",
"R", "R",
@ -155,6 +168,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("coap://R@////////////////7///v=1", VEC("coap://R@////////////////7///v=1",
true,
"", "",
"", "",
"", "",
@ -163,14 +177,16 @@ static const validate_t validate_uris[26] = {
"", "",
-1), -1),
VEC("coa[:////[2001:db5ow:5own/Ov=1", VEC("coa[:////[2001:db5ow:5own/Ov=1",
"coa[", false,
"", "",
"", "",
"", "",
"//[2001:db5ow:5own/Ov=1", "",
"coa[:////[2001:db5ow:5own/Ov=1",
"", "",
0), 0),
VEC("tel:+1-816-555-1212", VEC("tel:+1-816-555-1212",
true,
"tel", "tel",
"", "",
"", "",
@ -179,6 +195,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("sms:+15105550101,+15105550102?body=hello%20there", VEC("sms:+15105550101,+15105550102?body=hello%20there",
true,
"sms", "sms",
"", "",
"", "",
@ -187,6 +204,7 @@ static const validate_t validate_uris[26] = {
"body=hello%20there", "body=hello%20there",
0), 0),
VEC("a", VEC("a",
false,
"", "",
"", "",
"", "",
@ -195,6 +213,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("mailto:test@example.com", VEC("mailto:test@example.com",
true,
"mailto", "mailto",
"", "",
"", "",
@ -203,6 +222,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("ftp://ftp.is.co.za/rfc/rfc1808.txt", VEC("ftp://ftp.is.co.za/rfc/rfc1808.txt",
true,
"ftp", "ftp",
"", "",
"ftp.is.co.za", "ftp.is.co.za",
@ -211,6 +231,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("http://www.ietf.org/rfc/rfc2396.txt", VEC("http://www.ietf.org/rfc/rfc2396.txt",
true,
"http", "http",
"", "",
"www.ietf.org", "www.ietf.org",
@ -219,6 +240,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("ldap://[2001:db8::7]/c=GB?objectClass?one", VEC("ldap://[2001:db8::7]/c=GB?objectClass?one",
true,
"ldap", "ldap",
"", "",
"[2001:db8::7]", "[2001:db8::7]",
@ -227,6 +249,7 @@ static const validate_t validate_uris[26] = {
"objectClass?one", "objectClass?one",
0), 0),
VEC("mailto:John.Doe@example.com", VEC("mailto:John.Doe@example.com",
true,
"mailto", "mailto",
"", "",
"", "",
@ -235,6 +258,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("news:comp.infosystems.www.servers.unix", VEC("news:comp.infosystems.www.servers.unix",
true,
"news", "news",
"", "",
"", "",
@ -243,6 +267,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("tel:+1-816-555-1212", VEC("tel:+1-816-555-1212",
true,
"tel", "tel",
"", "",
"", "",
@ -251,6 +276,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("telnet://192.0.2.16:80/", VEC("telnet://192.0.2.16:80/",
true,
"telnet", "telnet",
"", "",
"192.0.2.16", "192.0.2.16",
@ -259,6 +285,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("urn:oasis:names:specification:docbook:dtd:xml:4.1.2", VEC("urn:oasis:names:specification:docbook:dtd:xml:4.1.2",
true,
"urn", "urn",
"", "",
"", "",
@ -267,6 +294,7 @@ static const validate_t validate_uris[26] = {
"", "",
0), 0),
VEC("", VEC("",
false,
"", "",
"", "",
"", "",
@ -275,6 +303,7 @@ static const validate_t validate_uris[26] = {
"", "",
-1), -1),
VEC("/", VEC("/",
false,
"", "",
"", "",
"", "",
@ -282,6 +311,15 @@ static const validate_t validate_uris[26] = {
"/", "/",
"", "",
0), 0),
VEC("./this:that",
false,
"",
"",
"",
"",
"./this:that",
"",
0),
}; };
static char _failure_msg[VEC_MSG_LEN]; static char _failure_msg[VEC_MSG_LEN];
@ -291,6 +329,8 @@ static void test_uri_parser__validate(void)
uri_parser_result_t ures; uri_parser_result_t ures;
for (unsigned i = 0; i < ARRAY_SIZE(validate_uris); i++) { for (unsigned i = 0; i < ARRAY_SIZE(validate_uris); i++) {
int res = uri_parser_process_string(&ures, validate_uris[i].uri); int res = uri_parser_process_string(&ures, validate_uris[i].uri);
TEST_ASSERT_EQUAL_INT(validate_uris[i].full_uri,
uri_parser_is_absolute_string(validate_uris[i].uri));
TEST_ASSERT_EQUAL_INT(validate_uris[i].expected, res); TEST_ASSERT_EQUAL_INT(validate_uris[i].expected, res);
if (res == 0) { if (res == 0) {
VEC_CHECK(scheme, i, _failure_msg); VEC_CHECK(scheme, i, _failure_msg);