ali@475: /* ali@475: * Copyright (C) 2016 J. Ali Harlow ali@475: * ali@475: * This program is free software; you can redistribute it and/or modify ali@475: * it under the terms of the GNU General Public License as published by ali@475: * the Free Software Foundation; either version 2 of the License, or ali@475: * (at your option) any later version. ali@475: * ali@475: * This program is distributed in the hope that it will be useful, ali@475: * but WITHOUT ANY WARRANTY; without even the implied warranty of ali@475: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ali@475: * GNU General Public License for more details. ali@475: * ali@475: * You should have received a copy of the GNU General Public License along ali@475: * with this program; if not, write to the Free Software Foundation, Inc., ali@475: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ali@475: */ ali@475: ali@475: #include "config.h" ali@475: ali@475: #include ali@475: #include ali@475: #include ali@475: #include "razor.h" ali@475: #include "razor-internal.h" ali@475: ali@475: static int test_parse(const char *uri) ali@475: { ali@475: struct razor_uri ru; ali@475: struct razor_error *error = NULL; ali@475: int r; ali@475: ali@475: r = razor_uri_parse(&ru, uri, &error); ali@475: razor_uri_destroy(&ru); ali@475: ali@475: if (r < 0) { ali@475: fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n", ali@475: uri, razor_error_get_msg(error)); ali@475: return -1; ali@475: } ali@475: ali@475: return r; ali@475: } ali@475: ali@475: static int test_normalize(const char *uri, const char *expected_normalized_uri) ali@475: { ali@475: struct razor_uri ru; ali@475: struct razor_error *error = NULL; ali@475: int r; ali@475: char *normalized_uri; ali@475: ali@475: r = razor_uri_parse(&ru, uri, &error); ali@475: ali@475: if (r < 0) { ali@475: razor_uri_destroy(&ru); ali@475: fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n", ali@475: uri, razor_error_get_msg(error)); ali@475: return -1; ali@475: } ali@475: ali@475: razor_uri_normalize(&ru); ali@475: normalized_uri = razor_uri_recompose(&ru); ali@475: razor_uri_destroy(&ru); ali@475: ali@475: if (strcmp(normalized_uri, expected_normalized_uri)) { ali@475: fprintf(stderr, "Fail: normalization of \"%s\" produces " ali@475: "\"%s\", expected \"%s\"\n", uri, normalized_uri, ali@475: expected_normalized_uri); ali@475: r = -1; ali@475: } ali@475: ali@475: free(normalized_uri); ali@475: return r; ali@475: } ali@475: ali@475: static int test_resolve(const char *base_uri, const char *relative_reference, ali@475: const char *expected_target_uri) ali@475: { ali@475: struct razor_uri base_ru, rr_ru, target_ru; ali@475: struct razor_error *error = NULL; ali@475: char *target_uri; ali@475: int r; ali@475: ali@475: r = razor_uri_parse(&base_ru, base_uri, &error); ali@475: ali@475: if (r < 0) { ali@475: fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n", ali@475: base_uri, razor_error_get_msg(error)); ali@475: return -1; ali@475: } ali@475: ali@475: r = razor_uri_parse(&rr_ru, relative_reference, &error); ali@475: ali@475: if (r < 0) { ali@475: fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n", ali@475: relative_reference, razor_error_get_msg(error)); ali@475: razor_uri_destroy(&base_ru); ali@475: return -1; ali@475: } ali@475: ali@475: razor_uri_resolve(&target_ru, &base_ru, &rr_ru); ali@475: razor_uri_destroy(&base_ru); ali@475: razor_uri_destroy(&rr_ru); ali@475: ali@475: target_uri = razor_uri_recompose(&target_ru); ali@475: razor_uri_destroy(&target_ru); ali@475: ali@475: if (strcmp(target_uri, expected_target_uri)) { ali@475: fprintf(stderr, ali@475: "Fail: razor_uri_resolve(\"%s\", \"%s\") returns %s\n", ali@475: base_uri, relative_reference, target_uri); ali@475: free(target_uri); ali@475: return -1; ali@475: } ali@475: ali@475: free(target_uri); ali@475: ali@475: return 0; ali@475: } ali@475: ali@475: int main(int argc, char *argv[]) ali@475: { ali@475: int r = 0; ali@475: ali@475: r |= test_parse("file:"); ali@475: r |= test_parse("file:/"); ali@475: r |= test_parse("file:///"); ali@475: ali@475: /* From RFC 3986 § 6.2.2 */ ali@475: r |= test_normalize("eXAMPLE://a/./b/../b/%63/%7bfoo%7d", ali@475: "example://a/b/c/%7Bfoo%7D"); ali@475: ali@475: /* From RFC 3986 § 5.4.1 */ ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g:h", "g:h"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g", "http://a/b/c/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "./g", "http://a/b/c/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g/", "http://a/b/c/g/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "/g", "http://a/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "//g", "http://g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "?y", "http://a/b/c/d;p?y"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", ";x", "http://a/b/c/;x"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g;x?y#s", ali@475: "http://a/b/c/g;x?y#s"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", ".", "http://a/b/c/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "./", "http://a/b/c/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "..", "http://a/b/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../", "http://a/b/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../g", "http://a/b/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../..", "http://a/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../../", "http://a/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../../g", "http://a/g"); ali@475: ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../../../g", "http://a/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "../../../../g", "http://a/g"); ali@475: ali@475: r |= test_resolve("http://a/b/c/d;p?q", "/./g", "http://a/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "/../g", "http://a/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g.", "http://a/b/c/g."); ali@475: r |= test_resolve("http://a/b/c/d;p?q", ".g", "http://a/b/c/.g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g..", "http://a/b/c/g.."); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "..g", "http://a/b/c/..g"); ali@475: ali@475: r |= test_resolve("http://a/b/c/d;p?q", "./../g", "http://a/b/g"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/./y", ali@475: "http://a/b/c/g;x=1/y"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y"); ali@475: ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g?y/./x", ali@475: "http://a/b/c/g?y/./x"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g?y/../x", ali@475: "http://a/b/c/g?y/../x"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g#s/./x", ali@475: "http://a/b/c/g#s/./x"); ali@475: r |= test_resolve("http://a/b/c/d;p?q", "g#s/../x", ali@475: "http://a/b/c/g#s/../x"); ali@475: ali@475: r |= test_resolve("http://a/b/c/d;p?q", "http:g", "http:g"); ali@475: ali@475: /* From http://www.w3.org/2000/10/swap/uripath.py */ ali@475: r |= test_resolve("foo:xyz", "bar:abc", "bar:abc"); ali@475: ali@475: r |= test_resolve("http://example/x/y/z", "../abc", ali@475: "http://example/x/abc"); ali@475: r |= test_resolve("http://example2/x/y/z", "http://example/x/abc", ali@475: "http://example/x/abc"); ali@475: r |= test_resolve("http://ex/x/y/z", "../r", "http://ex/x/r"); ali@475: // "http://ex/x/y/z", "../../r", "http://ex/r"); // DanC had this. ali@475: r |= test_resolve("http://ex/x/y", "q/r", "http://ex/x/q/r"); ali@475: r |= test_resolve("http://ex/x/y", "q/r#s", "http://ex/x/q/r#s"); ali@475: r |= test_resolve("http://ex/x/y", "q/r#s/t", "http://ex/x/q/r#s/t"); ali@475: r |= test_resolve("http://ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r"); ali@475: r |= test_resolve("http://ex/x/y", "", "http://ex/x/y"); ali@475: r |= test_resolve("http://ex/x/y/", "", "http://ex/x/y/"); ali@475: r |= test_resolve("http://ex/x/y/pdq", "", "http://ex/x/y/pdq"); ali@475: r |= test_resolve("http://ex/x/y/", "z/", "http://ex/x/y/z/"); ali@475: r |= test_resolve("file:/swap/test/animal.rdf", "#Animal", ali@475: "file:/swap/test/animal.rdf#Animal"); ali@475: r |= test_resolve("file:/e/x/y/z", "../abc", "file:/e/x/abc"); ali@475: r |= test_resolve("file:/example2/x/y/z", "/example/x/abc", ali@475: "file:/example/x/abc"); ali@475: r |= test_resolve("file:/ex/x/y/z", "../r", "file:/ex/x/r"); ali@475: r |= test_resolve("file:/ex/x/y/z", "/r", "file:/r"); ali@475: r |= test_resolve("file:/ex/x/y", "q/r", "file:/ex/x/q/r"); ali@475: r |= test_resolve("file:/ex/x/y", "q/r#s", "file:/ex/x/q/r#s"); ali@475: r |= test_resolve("file:/ex/x/y", "q/r#", "file:/ex/x/q/r#"); ali@475: r |= test_resolve("file:/ex/x/y", "q/r#s/t", "file:/ex/x/q/r#s/t"); ali@475: r |= test_resolve("file:/ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r"); ali@475: r |= test_resolve("file:/ex/x/y", "", "file:/ex/x/y"); ali@475: r |= test_resolve("file:/ex/x/y/", "", "file:/ex/x/y/"); ali@475: r |= test_resolve("file:/ex/x/y/pdq", "", "file:/ex/x/y/pdq"); ali@475: r |= test_resolve("file:/ex/x/y/", "z/", "file:/ex/x/y/z/"); ali@475: r |= test_resolve("file:/devel/WWW/2000/10/swap/test/reluri-1.n3", ali@475: "file://meetings.example.com/cal#m1", ali@475: "file://meetings.example.com/cal#m1"); ali@475: r |= test_resolve("file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3", ali@475: "file://meetings.example.com/cal#m1", ali@475: "file://meetings.example.com/cal#m1"); ali@475: r |= test_resolve("file:/some/dir/foo", "./#blort", ali@475: "file:/some/dir/#blort"); ali@475: r |= test_resolve("file:/some/dir/foo", "./#", "file:/some/dir/#"); ali@475: /* From Graham Klyne Thu, 20 Feb 2003 18:08:17 +0000 */ ali@475: r |= test_resolve("http://example/x/y%2Fz", "abc", ali@475: "http://example/x/abc"); ali@475: r |= test_resolve("http://example/x/y/z", "/x%2Fabc", ali@475: "http://example/x%2Fabc"); ali@475: r |= test_resolve("http://example/x/y%2Fz", "/x%2Fabc", ali@475: "http://example/x%2Fabc"); ali@475: r |= test_resolve("http://example/x%2Fy/z", "abc", ali@475: "http://example/x%2Fy/abc"); ali@475: /* Ryan Lee */ ali@475: r |= test_resolve("http://example/x/abc.efg", "./", ali@475: "http://example/x/"); ali@475: ali@475: exit(r ? 1 : 0); ali@475: }