Go to the documentation of this file.
36 #define PRINT_COMPONENT(comp) \
37 len = uc.url_component_end_##comp - uc.comp; \
38 if (len) printf(" "#comp": %.*s\n", len, uc.comp);
50 static void test(
const char *
base,
const char *rel)
52 char buf[200], buf2[200], buf_dos[200], buf_native[200];
67 if (strcmp(buf, buf_dos))
68 printf(
"%50s %-20sDOS %s\n",
base, rel, buf_dos);
69 if (HAVE_DOS_PATHS && strcmp(buf_dos, buf_native) ||
70 !HAVE_DOS_PATHS && strcmp(buf, buf_native))
71 printf(
"Native mismatch\n");
76 if (strcmp(buf, buf2)) {
77 printf(
"In-place handling of %s + %s failed\n",
base, rel);
83 static void test2(
const char *url)
91 av_url_split(proto,
sizeof(proto), auth,
sizeof(auth), host,
sizeof(host), &port, path,
sizeof(path), url);
92 printf(
"%-60s => %-15s %-15s %-15s %5d %s\n", url, proto, auth, host, port, path);
97 printf(
"Testing ff_url_decompose:\n\n");
98 test_decompose(
"http://user:pass@ffmpeg:8080/dir/file?query#fragment");
108 printf(
"Testing ff_make_absolute_url:\n");
110 test(
"/foo/bar",
"baz");
111 test(
"/foo/bar",
"../baz");
112 test(
"/foo/bar",
"/baz");
113 test(
"/foo/bar",
"../../../baz");
114 test(
"http://server/foo/",
"baz");
115 test(
"http://server/foo/bar",
"baz");
116 test(
"http://server/foo/",
"../baz");
117 test(
"http://server/foo/bar/123",
"../../baz");
118 test(
"http://server/foo/bar/123",
"/baz");
119 test(
"http://server/foo/bar/123",
"https://other/url");
120 test(
"http://server/foo/bar?param=value/with/slashes",
"/baz");
121 test(
"http://server/foo/bar?param&otherparam",
"?someparam");
122 test(
"http://server/foo/bar",
"//other/url");
123 test(
"http://server/foo/bar",
"../../../../../other/url");
124 test(
"http://server/foo/bar",
"/../../../../../other/url");
125 test(
"http://server/foo/bar",
"/test/../../../../../other/url");
126 test(
"http://server/foo/bar",
"/test/../../test/../../../other/url");
127 test(
"http://server/foo/bar",
"file:../baz/qux");
128 test(
"http://server/foo//bar/",
"../../");
129 test(
"file:../tmp/foo",
"../bar/");
130 test(
"file:../tmp/foo",
"file:../bar/");
131 test(
"http://server/foo/bar",
"./");
132 test(
"http://server/foo/bar",
".dotfile");
133 test(
"http://server/foo/bar",
"..doubledotfile");
134 test(
"http://server/foo/bar",
"double..dotfile");
135 test(
"http://server/foo/bar",
"doubledotfile..");
136 test(
"file1",
"file2");
137 test(
"dir/file1",
"file2");
138 test(
"dir/file1",
"../file2");
139 test(
"dir\\file1",
"file2");
140 test(
"\\\\srv\\shr\\file",
"..\\..\\dummy");
141 test(
"\\\\srv\\shr\\file",
"dummy");
142 test(
"\\\\srv\\shr\\file",
"\\\\srv2\\shr2\\file2");
143 test(
"\\\\srv\\shr\\file",
"d:/file");
144 test(
"C:\\dir\\a",
"..\\file");
145 test(
"C:\\dir\\a",
"\\\\srv\\shr\\file");
146 test(
"C:\\dir\\a",
"d:\\file");
147 test(
"http://a/b",
"\\\\srv\\shr\\file");
148 test(
"http://a/b",
"//srv/shr/file");
149 test(
"http://a/b",
"d:\\file");
150 test(
"http://a/b",
"C:/file");
153 test(
"http://a/b/c/d;p?q",
"g:h");
154 test(
"http://a/b/c/d;p?q",
"g");
155 test(
"http://a/b/c/d;p?q",
"./g");
156 test(
"http://a/b/c/d;p?q",
"g/");
157 test(
"http://a/b/c/d;p?q",
"/g");
158 test(
"http://a/b/c/d;p?q",
"//g");
159 test(
"http://a/b/c/d;p?q",
"?y");
160 test(
"http://a/b/c/d;p?q",
"g?y");
161 test(
"http://a/b/c/d;p?q",
"#s");
162 test(
"http://a/b/c/d;p?q",
"g#s");
163 test(
"http://a/b/c/d;p?q",
"g?y#s");
164 test(
"http://a/b/c/d;p?q",
";x");
165 test(
"http://a/b/c/d;p?q",
"g;x");
166 test(
"http://a/b/c/d;p?q",
"g;x?y#s");
167 test(
"http://a/b/c/d;p?q",
"");
168 test(
"http://a/b/c/d;p?q",
".");
169 test(
"http://a/b/c/d;p?q",
"./");
170 test(
"http://a/b/c/d;p?q",
"..");
171 test(
"http://a/b/c/d;p?q",
"../");
172 test(
"http://a/b/c/d;p?q",
"../g");
173 test(
"http://a/b/c/d;p?q",
"../..");
174 test(
"http://a/b/c/d;p?q",
"../../");
175 test(
"http://a/b/c/d;p?q",
"../../g");
176 test(
"http://a/b/c/d;p?q",
"../../../g");
177 test(
"http://a/b/c/d;p?q",
"../../../../g");
178 test(
"http://a/b/c/d;p?q",
"/./g");
179 test(
"http://a/b/c/d;p?q",
"/../g");
180 test(
"http://a/b/c/d;p?q",
"g.");
181 test(
"http://a/b/c/d;p?q",
".g");
182 test(
"http://a/b/c/d;p?q",
"g..");
183 test(
"http://a/b/c/d;p?q",
"..g");
184 test(
"http://a/b/c/d;p?q",
"./../g");
185 test(
"http://a/b/c/d;p?q",
"./g/.");
186 test(
"http://a/b/c/d;p?q",
"g/./h");
187 test(
"http://a/b/c/d;p?q",
"g/../h");
188 test(
"http://a/b/c/d;p?q",
"g;x=1/./y");
189 test(
"http://a/b/c/d;p?q",
"g;x=1/../y");
190 test(
"http://a/b/c/d;p?q",
"g?y/./x");
191 test(
"http://a/b/c/d;p?q",
"g?y/../x");
192 test(
"http://a/b/c/d;p?q",
"g#s/./x");
193 test(
"http://a/b/c/d;p?q",
"g#s/../x");
195 printf(
"\nTesting av_url_split:\n");
197 test2(
"http://server/foo/");
198 test2(
"http://example.com/foo/bar");
199 test2(
"http://user:pass@localhost:8080/foo/bar/123");
200 test2(
"http://server/foo/bar?param=value/with/slashes");
201 test2(
"https://1l-lh.a.net/i/1LIVE_HDS@179577/master.m3u8");
202 test2(
"ftp://u:p%2B%2F2@ftp.pbt.com/ExportHD.mpg");
203 test2(
"https://key.dns.com?key_id=2&model_id=12345&&access_key=");
204 test2(
"http://example.com#tag");
int ff_make_absolute_url2(char *buf, int size, const char *base, const char *rel, int handle_dos_paths)
Convert a relative url into an absolute url, given a base url.
static void test(const char *base, const char *rel)
#define PRINT_COMPONENT(comp)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
printf("static const uint8_t my_array[100] = {\n")
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
static void test_decompose(const char *url)
int ff_make_absolute_url(char *buf, int size, const char *base, const char *rel)
Convert a relative url into an absolute url, given a base url.
static void test2(const char *url)
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.