|
ali@475
|
1 |
/*
|
|
ali@475
|
2 |
* Copyright (C) 2016 J. Ali Harlow <ali@juiblex.co.uk>
|
|
ali@475
|
3 |
*
|
|
ali@475
|
4 |
* This program is free software; you can redistribute it and/or modify
|
|
ali@475
|
5 |
* it under the terms of the GNU General Public License as published by
|
|
ali@475
|
6 |
* the Free Software Foundation; either version 2 of the License, or
|
|
ali@475
|
7 |
* (at your option) any later version.
|
|
ali@475
|
8 |
*
|
|
ali@475
|
9 |
* This program is distributed in the hope that it will be useful,
|
|
ali@475
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ali@475
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
ali@475
|
12 |
* GNU General Public License for more details.
|
|
ali@475
|
13 |
*
|
|
ali@475
|
14 |
* You should have received a copy of the GNU General Public License along
|
|
ali@475
|
15 |
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ali@475
|
16 |
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ali@475
|
17 |
*/
|
|
ali@475
|
18 |
|
|
ali@475
|
19 |
#include "config.h"
|
|
ali@475
|
20 |
|
|
ali@475
|
21 |
#include <stdlib.h>
|
|
ali@475
|
22 |
#include <stdio.h>
|
|
ali@475
|
23 |
#include <string.h>
|
|
ali@475
|
24 |
#include "razor.h"
|
|
ali@475
|
25 |
#include "razor-internal.h"
|
|
ali@475
|
26 |
|
|
ali@475
|
27 |
static int test_parse(const char *uri)
|
|
ali@475
|
28 |
{
|
|
ali@475
|
29 |
struct razor_uri ru;
|
|
ali@475
|
30 |
struct razor_error *error = NULL;
|
|
ali@475
|
31 |
int r;
|
|
ali@475
|
32 |
|
|
ali@475
|
33 |
r = razor_uri_parse(&ru, uri, &error);
|
|
ali@475
|
34 |
razor_uri_destroy(&ru);
|
|
ali@475
|
35 |
|
|
ali@475
|
36 |
if (r < 0) {
|
|
ali@475
|
37 |
fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
|
|
ali@475
|
38 |
uri, razor_error_get_msg(error));
|
|
ali@475
|
39 |
return -1;
|
|
ali@475
|
40 |
}
|
|
ali@475
|
41 |
|
|
ali@475
|
42 |
return r;
|
|
ali@475
|
43 |
}
|
|
ali@475
|
44 |
|
|
ali@475
|
45 |
static int test_normalize(const char *uri, const char *expected_normalized_uri)
|
|
ali@475
|
46 |
{
|
|
ali@475
|
47 |
struct razor_uri ru;
|
|
ali@475
|
48 |
struct razor_error *error = NULL;
|
|
ali@475
|
49 |
int r;
|
|
ali@475
|
50 |
char *normalized_uri;
|
|
ali@475
|
51 |
|
|
ali@475
|
52 |
r = razor_uri_parse(&ru, uri, &error);
|
|
ali@475
|
53 |
|
|
ali@475
|
54 |
if (r < 0) {
|
|
ali@475
|
55 |
razor_uri_destroy(&ru);
|
|
ali@475
|
56 |
fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
|
|
ali@475
|
57 |
uri, razor_error_get_msg(error));
|
|
ali@475
|
58 |
return -1;
|
|
ali@475
|
59 |
}
|
|
ali@475
|
60 |
|
|
ali@475
|
61 |
razor_uri_normalize(&ru);
|
|
ali@475
|
62 |
normalized_uri = razor_uri_recompose(&ru);
|
|
ali@475
|
63 |
razor_uri_destroy(&ru);
|
|
ali@475
|
64 |
|
|
ali@475
|
65 |
if (strcmp(normalized_uri, expected_normalized_uri)) {
|
|
ali@475
|
66 |
fprintf(stderr, "Fail: normalization of \"%s\" produces "
|
|
ali@475
|
67 |
"\"%s\", expected \"%s\"\n", uri, normalized_uri,
|
|
ali@475
|
68 |
expected_normalized_uri);
|
|
ali@475
|
69 |
r = -1;
|
|
ali@475
|
70 |
}
|
|
ali@475
|
71 |
|
|
ali@475
|
72 |
free(normalized_uri);
|
|
ali@475
|
73 |
return r;
|
|
ali@475
|
74 |
}
|
|
ali@475
|
75 |
|
|
ali@475
|
76 |
static int test_resolve(const char *base_uri, const char *relative_reference,
|
|
ali@475
|
77 |
const char *expected_target_uri)
|
|
ali@475
|
78 |
{
|
|
ali@475
|
79 |
struct razor_uri base_ru, rr_ru, target_ru;
|
|
ali@475
|
80 |
struct razor_error *error = NULL;
|
|
ali@475
|
81 |
char *target_uri;
|
|
ali@475
|
82 |
int r;
|
|
ali@475
|
83 |
|
|
ali@475
|
84 |
r = razor_uri_parse(&base_ru, base_uri, &error);
|
|
ali@475
|
85 |
|
|
ali@475
|
86 |
if (r < 0) {
|
|
ali@475
|
87 |
fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
|
|
ali@475
|
88 |
base_uri, razor_error_get_msg(error));
|
|
ali@475
|
89 |
return -1;
|
|
ali@475
|
90 |
}
|
|
ali@475
|
91 |
|
|
ali@475
|
92 |
r = razor_uri_parse(&rr_ru, relative_reference, &error);
|
|
ali@475
|
93 |
|
|
ali@475
|
94 |
if (r < 0) {
|
|
ali@475
|
95 |
fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
|
|
ali@475
|
96 |
relative_reference, razor_error_get_msg(error));
|
|
ali@475
|
97 |
razor_uri_destroy(&base_ru);
|
|
ali@475
|
98 |
return -1;
|
|
ali@475
|
99 |
}
|
|
ali@475
|
100 |
|
|
ali@475
|
101 |
razor_uri_resolve(&target_ru, &base_ru, &rr_ru);
|
|
ali@475
|
102 |
razor_uri_destroy(&base_ru);
|
|
ali@475
|
103 |
razor_uri_destroy(&rr_ru);
|
|
ali@475
|
104 |
|
|
ali@475
|
105 |
target_uri = razor_uri_recompose(&target_ru);
|
|
ali@475
|
106 |
razor_uri_destroy(&target_ru);
|
|
ali@475
|
107 |
|
|
ali@475
|
108 |
if (strcmp(target_uri, expected_target_uri)) {
|
|
ali@475
|
109 |
fprintf(stderr,
|
|
ali@475
|
110 |
"Fail: razor_uri_resolve(\"%s\", \"%s\") returns %s\n",
|
|
ali@475
|
111 |
base_uri, relative_reference, target_uri);
|
|
ali@475
|
112 |
free(target_uri);
|
|
ali@475
|
113 |
return -1;
|
|
ali@475
|
114 |
}
|
|
ali@475
|
115 |
|
|
ali@475
|
116 |
free(target_uri);
|
|
ali@475
|
117 |
|
|
ali@475
|
118 |
return 0;
|
|
ali@475
|
119 |
}
|
|
ali@475
|
120 |
|
|
ali@475
|
121 |
int main(int argc, char *argv[])
|
|
ali@475
|
122 |
{
|
|
ali@475
|
123 |
int r = 0;
|
|
ali@475
|
124 |
|
|
ali@475
|
125 |
r |= test_parse("file:");
|
|
ali@475
|
126 |
r |= test_parse("file:/");
|
|
ali@475
|
127 |
r |= test_parse("file:///");
|
|
ali@475
|
128 |
|
|
ali@475
|
129 |
/* From RFC 3986 § 6.2.2 */
|
|
ali@475
|
130 |
r |= test_normalize("eXAMPLE://a/./b/../b/%63/%7bfoo%7d",
|
|
ali@475
|
131 |
"example://a/b/c/%7Bfoo%7D");
|
|
ali@475
|
132 |
|
|
ali@475
|
133 |
/* From RFC 3986 § 5.4.1 */
|
|
ali@475
|
134 |
r |= test_resolve("http://a/b/c/d;p?q", "g:h", "g:h");
|
|
ali@475
|
135 |
r |= test_resolve("http://a/b/c/d;p?q", "g", "http://a/b/c/g");
|
|
ali@475
|
136 |
r |= test_resolve("http://a/b/c/d;p?q", "./g", "http://a/b/c/g");
|
|
ali@475
|
137 |
r |= test_resolve("http://a/b/c/d;p?q", "g/", "http://a/b/c/g/");
|
|
ali@475
|
138 |
r |= test_resolve("http://a/b/c/d;p?q", "/g", "http://a/g");
|
|
ali@475
|
139 |
r |= test_resolve("http://a/b/c/d;p?q", "//g", "http://g");
|
|
ali@475
|
140 |
r |= test_resolve("http://a/b/c/d;p?q", "?y", "http://a/b/c/d;p?y");
|
|
ali@475
|
141 |
r |= test_resolve("http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y");
|
|
ali@475
|
142 |
r |= test_resolve("http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s");
|
|
ali@475
|
143 |
r |= test_resolve("http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s");
|
|
ali@475
|
144 |
r |= test_resolve("http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s");
|
|
ali@475
|
145 |
r |= test_resolve("http://a/b/c/d;p?q", ";x", "http://a/b/c/;x");
|
|
ali@475
|
146 |
r |= test_resolve("http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x");
|
|
ali@475
|
147 |
r |= test_resolve("http://a/b/c/d;p?q", "g;x?y#s",
|
|
ali@475
|
148 |
"http://a/b/c/g;x?y#s");
|
|
ali@475
|
149 |
r |= test_resolve("http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q");
|
|
ali@475
|
150 |
r |= test_resolve("http://a/b/c/d;p?q", ".", "http://a/b/c/");
|
|
ali@475
|
151 |
r |= test_resolve("http://a/b/c/d;p?q", "./", "http://a/b/c/");
|
|
ali@475
|
152 |
r |= test_resolve("http://a/b/c/d;p?q", "..", "http://a/b/");
|
|
ali@475
|
153 |
r |= test_resolve("http://a/b/c/d;p?q", "../", "http://a/b/");
|
|
ali@475
|
154 |
r |= test_resolve("http://a/b/c/d;p?q", "../g", "http://a/b/g");
|
|
ali@475
|
155 |
r |= test_resolve("http://a/b/c/d;p?q", "../..", "http://a/");
|
|
ali@475
|
156 |
r |= test_resolve("http://a/b/c/d;p?q", "../../", "http://a/");
|
|
ali@475
|
157 |
r |= test_resolve("http://a/b/c/d;p?q", "../../g", "http://a/g");
|
|
ali@475
|
158 |
|
|
ali@475
|
159 |
r |= test_resolve("http://a/b/c/d;p?q", "../../../g", "http://a/g");
|
|
ali@475
|
160 |
r |= test_resolve("http://a/b/c/d;p?q", "../../../../g", "http://a/g");
|
|
ali@475
|
161 |
|
|
ali@475
|
162 |
r |= test_resolve("http://a/b/c/d;p?q", "/./g", "http://a/g");
|
|
ali@475
|
163 |
r |= test_resolve("http://a/b/c/d;p?q", "/../g", "http://a/g");
|
|
ali@475
|
164 |
r |= test_resolve("http://a/b/c/d;p?q", "g.", "http://a/b/c/g.");
|
|
ali@475
|
165 |
r |= test_resolve("http://a/b/c/d;p?q", ".g", "http://a/b/c/.g");
|
|
ali@475
|
166 |
r |= test_resolve("http://a/b/c/d;p?q", "g..", "http://a/b/c/g..");
|
|
ali@475
|
167 |
r |= test_resolve("http://a/b/c/d;p?q", "..g", "http://a/b/c/..g");
|
|
ali@475
|
168 |
|
|
ali@475
|
169 |
r |= test_resolve("http://a/b/c/d;p?q", "./../g", "http://a/b/g");
|
|
ali@475
|
170 |
r |= test_resolve("http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/");
|
|
ali@475
|
171 |
r |= test_resolve("http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h");
|
|
ali@475
|
172 |
r |= test_resolve("http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h");
|
|
ali@475
|
173 |
r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/./y",
|
|
ali@475
|
174 |
"http://a/b/c/g;x=1/y");
|
|
ali@475
|
175 |
r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y");
|
|
ali@475
|
176 |
|
|
ali@475
|
177 |
r |= test_resolve("http://a/b/c/d;p?q", "g?y/./x",
|
|
ali@475
|
178 |
"http://a/b/c/g?y/./x");
|
|
ali@475
|
179 |
r |= test_resolve("http://a/b/c/d;p?q", "g?y/../x",
|
|
ali@475
|
180 |
"http://a/b/c/g?y/../x");
|
|
ali@475
|
181 |
r |= test_resolve("http://a/b/c/d;p?q", "g#s/./x",
|
|
ali@475
|
182 |
"http://a/b/c/g#s/./x");
|
|
ali@475
|
183 |
r |= test_resolve("http://a/b/c/d;p?q", "g#s/../x",
|
|
ali@475
|
184 |
"http://a/b/c/g#s/../x");
|
|
ali@475
|
185 |
|
|
ali@475
|
186 |
r |= test_resolve("http://a/b/c/d;p?q", "http:g", "http:g");
|
|
ali@475
|
187 |
|
|
ali@475
|
188 |
/* From http://www.w3.org/2000/10/swap/uripath.py */
|
|
ali@475
|
189 |
r |= test_resolve("foo:xyz", "bar:abc", "bar:abc");
|
|
ali@475
|
190 |
|
|
ali@475
|
191 |
r |= test_resolve("http://example/x/y/z", "../abc",
|
|
ali@475
|
192 |
"http://example/x/abc");
|
|
ali@475
|
193 |
r |= test_resolve("http://example2/x/y/z", "http://example/x/abc",
|
|
ali@475
|
194 |
"http://example/x/abc");
|
|
ali@475
|
195 |
r |= test_resolve("http://ex/x/y/z", "../r", "http://ex/x/r");
|
|
ali@475
|
196 |
// "http://ex/x/y/z", "../../r", "http://ex/r"); // DanC had this.
|
|
ali@475
|
197 |
r |= test_resolve("http://ex/x/y", "q/r", "http://ex/x/q/r");
|
|
ali@475
|
198 |
r |= test_resolve("http://ex/x/y", "q/r#s", "http://ex/x/q/r#s");
|
|
ali@475
|
199 |
r |= test_resolve("http://ex/x/y", "q/r#s/t", "http://ex/x/q/r#s/t");
|
|
ali@475
|
200 |
r |= test_resolve("http://ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r");
|
|
ali@475
|
201 |
r |= test_resolve("http://ex/x/y", "", "http://ex/x/y");
|
|
ali@475
|
202 |
r |= test_resolve("http://ex/x/y/", "", "http://ex/x/y/");
|
|
ali@475
|
203 |
r |= test_resolve("http://ex/x/y/pdq", "", "http://ex/x/y/pdq");
|
|
ali@475
|
204 |
r |= test_resolve("http://ex/x/y/", "z/", "http://ex/x/y/z/");
|
|
ali@475
|
205 |
r |= test_resolve("file:/swap/test/animal.rdf", "#Animal",
|
|
ali@475
|
206 |
"file:/swap/test/animal.rdf#Animal");
|
|
ali@475
|
207 |
r |= test_resolve("file:/e/x/y/z", "../abc", "file:/e/x/abc");
|
|
ali@475
|
208 |
r |= test_resolve("file:/example2/x/y/z", "/example/x/abc",
|
|
ali@475
|
209 |
"file:/example/x/abc");
|
|
ali@475
|
210 |
r |= test_resolve("file:/ex/x/y/z", "../r", "file:/ex/x/r");
|
|
ali@475
|
211 |
r |= test_resolve("file:/ex/x/y/z", "/r", "file:/r");
|
|
ali@475
|
212 |
r |= test_resolve("file:/ex/x/y", "q/r", "file:/ex/x/q/r");
|
|
ali@475
|
213 |
r |= test_resolve("file:/ex/x/y", "q/r#s", "file:/ex/x/q/r#s");
|
|
ali@475
|
214 |
r |= test_resolve("file:/ex/x/y", "q/r#", "file:/ex/x/q/r#");
|
|
ali@475
|
215 |
r |= test_resolve("file:/ex/x/y", "q/r#s/t", "file:/ex/x/q/r#s/t");
|
|
ali@475
|
216 |
r |= test_resolve("file:/ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r");
|
|
ali@475
|
217 |
r |= test_resolve("file:/ex/x/y", "", "file:/ex/x/y");
|
|
ali@475
|
218 |
r |= test_resolve("file:/ex/x/y/", "", "file:/ex/x/y/");
|
|
ali@475
|
219 |
r |= test_resolve("file:/ex/x/y/pdq", "", "file:/ex/x/y/pdq");
|
|
ali@475
|
220 |
r |= test_resolve("file:/ex/x/y/", "z/", "file:/ex/x/y/z/");
|
|
ali@475
|
221 |
r |= test_resolve("file:/devel/WWW/2000/10/swap/test/reluri-1.n3",
|
|
ali@475
|
222 |
"file://meetings.example.com/cal#m1",
|
|
ali@475
|
223 |
"file://meetings.example.com/cal#m1");
|
|
ali@475
|
224 |
r |= test_resolve("file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3",
|
|
ali@475
|
225 |
"file://meetings.example.com/cal#m1",
|
|
ali@475
|
226 |
"file://meetings.example.com/cal#m1");
|
|
ali@475
|
227 |
r |= test_resolve("file:/some/dir/foo", "./#blort",
|
|
ali@475
|
228 |
"file:/some/dir/#blort");
|
|
ali@475
|
229 |
r |= test_resolve("file:/some/dir/foo", "./#", "file:/some/dir/#");
|
|
ali@475
|
230 |
/* From Graham Klyne Thu, 20 Feb 2003 18:08:17 +0000 */
|
|
ali@475
|
231 |
r |= test_resolve("http://example/x/y%2Fz", "abc",
|
|
ali@475
|
232 |
"http://example/x/abc");
|
|
ali@475
|
233 |
r |= test_resolve("http://example/x/y/z", "/x%2Fabc",
|
|
ali@475
|
234 |
"http://example/x%2Fabc");
|
|
ali@475
|
235 |
r |= test_resolve("http://example/x/y%2Fz", "/x%2Fabc",
|
|
ali@475
|
236 |
"http://example/x%2Fabc");
|
|
ali@475
|
237 |
r |= test_resolve("http://example/x%2Fy/z", "abc",
|
|
ali@475
|
238 |
"http://example/x%2Fy/abc");
|
|
ali@475
|
239 |
/* Ryan Lee */
|
|
ali@475
|
240 |
r |= test_resolve("http://example/x/abc.efg", "./",
|
|
ali@475
|
241 |
"http://example/x/");
|
|
ali@475
|
242 |
|
|
ali@475
|
243 |
exit(r ? 1 : 0);
|
|
ali@475
|
244 |
}
|