test-http-url.c revision 5394bed8aaef2a6c1c870a34a23a7824e1f370bb
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2009-2012 Dovecot authors, see the included COPYING file */
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen#include "lib.h"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen#include "net.h"
e1e5b1f4ada9d9b4d36edeaf1c5229be90b12815Timo Sirainen#include "http-url.h"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen#include "test-common.h"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainenstruct valid_http_url_test {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen const char *url;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen enum http_url_parse_flags flags;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct http_url url_base;
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen struct http_url url_parsed;
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen};
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen/* Valid HTTP URL tests */
cd466fe7b84b0223735a6469c7f7bc225f65996dTimo Sirainenstatic struct valid_http_url_test valid_url_tests[] = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen /* Generic tests */
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen .url = "http://localhost",
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen .url_parsed = {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen .host_name = "localhost" }
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen },{
d56384d5226c8860079d0d0b08b83404e8c42986Timo Sirainen .url = "http://www.%65%78%61%6d%70%6c%65.com",
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen .url_parsed = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .host_name = "www.example.com" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "http://www.dovecot.org:8080",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = {
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen .host_name = "www.dovecot.org",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .port = 8080, .have_port = TRUE }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "http://127.0.0.1",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .host_name = "127.0.0.1",
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen .have_host_ip = TRUE }
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen#ifdef HAVE_IPV6
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen },{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen .url = "http://[::1]",
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen .url_parsed = {
6a9f9a5101b665fd2ef80c9e048a5eace78e01efTimo Sirainen .host_name = "[::1]",
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .have_host_ip = TRUE }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen .url = "http://[::1]:8080",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .host_name = "[::1]",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .have_host_ip = TRUE,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .port = 8080, .have_port = TRUE }
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen#endif
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen },{
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen .url = "http://www.example.com/"
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen "?question=What%20are%20you%20doing%3f&answer=Nothing.",
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url_parsed = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .path = "/",
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen .host_name = "www.example.com",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .enc_query = "question=What%20are%20you%20doing%3f&answer=Nothing." }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "http://www.example.com/#Status%20of%20development",
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .flags = HTTP_URL_ALLOW_FRAGMENT_PART,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = {
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .path = "/",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .host_name = "www.example.com",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .enc_fragment = "Status%20of%20development" }
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen /* RFC 3986, Section 5.4. Reference Resolution Examples
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen *
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen * Within a representation with a well defined base URI of
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen *
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen * http://a/b/c/d;p?q
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen *
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen * a relative reference is transformed to its target URI as follows.
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen *
a3ea111cfdbfd4f32baeb0bd7f1d72568c60a023Timo Sirainen * 5.4.1. Normal Examples
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen */
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "g" = "http://a/b/c/g"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "g",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g" }
a29a5b7520f7b8d6cdaf97e66d184b6a9e4f4ecfTimo Sirainen },{ // "./g" = "http://a/b/c/g"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "./g",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "g/" = "http://a/b/c/g/"
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url = "g/",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g/" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "/g" = "http://a/g"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "/g",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/g" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "//g" = "http://g"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "//g",
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "g" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "?y" = "http://a/b/c/d;p?y"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "?y",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "y" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "g?y" = "http://a/b/c/g?y"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "g?y",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g", .enc_query = "y" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "#s" = "http://a/b/c/d;p?q#s"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "#s",
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .flags = HTTP_URL_ALLOW_FRAGMENT_PART,
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .enc_fragment = "s" }
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen },{ // "g#s" = "http://a/b/c/g#s"
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen .url = "g#s",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .flags = HTTP_URL_ALLOW_FRAGMENT_PART,
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
fc34e919907845ce01ad04aa8213033596a1ae70Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g", .enc_fragment = "s" }
38499bb33c74acc6d725204e893cfc02a5890ec7Timo Sirainen
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen },{ // "g?y#s" = "http://a/b/c/g?y#s"
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url = "g?y#s",
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen .flags = HTTP_URL_ALLOW_FRAGMENT_PART,
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g", .enc_query = "y",
6defed8fef1781cb1d34353784232e87c19f173bTimo Sirainen .enc_fragment = "s" }
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen },{ // ";x" = "http://a/b/c/;x"
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url = ";x",
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
0c9754d1cf2ba0ff7873b6baa614ca10051a08fdTimo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/;x" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "g;x" = "http://a/b/c/g;x"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "g;x",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g;x" }
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen },{ // "g;x?y#s" = "http://a/b/c/g;x?y#s"
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen .url = "g;x?y#s",
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen .flags = HTTP_URL_ALLOW_FRAGMENT_PART,
9453e8d75cfd8fab2232cf772e9b120f308fb3eeTimo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/g;x", .enc_query = "y",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .enc_fragment = "s" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "" = "http://a/b/c/d;p?q"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = "",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen .url_parsed = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" }
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen },{ // "." = "http://a/b/c/"
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url = ".",
33ca6b017b6ebbd048651b5e3d16915001dbc291Timo Sirainen .url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/" }
},{ // "./" = "http://a/b/c/"
.url = "./",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/" }
},{ // ".." = "http://a/b/"
.url = "..",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/" }
},{ // "../" = "http://a/b/"
.url = "../",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/" }
},{ // "../g" = "http://a/b/g"
.url = "../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/g" }
},{ // "../.." = "http://a/"
.url = "../..",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/" }
},{ // "../../" = "http://a/"
.url = "../../",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/" }
},{ // "../../g" = "http://a/g"
.url = "../../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/g" }
/* 5.4.2. Abnormal Examples
*/
},{ // "../../../g" = "http://a/g"
.url = "../../../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/g" }
},{ // "../../../../g" = "http://a/g"
.url = "../../../../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/g" }
},{ // "/./g" = "http://a/g"
.url = "/./g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/g" }
},{ // "/../g" = "http://a/g"
.url = "/../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/g" }
},{ // "g." = "http://a/b/c/g."
.url = "g.",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g." }
},{ // ".g" = "http://a/b/c/.g"
.url = ".g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/.g" }
},{ // "g.." = "http://a/b/c/g.."
.url = "g..",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g.." }
},{ // "..g" = "http://a/b/c/..g"
.url = "..g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/..g" }
},{ // "./../g" = "http://a/b/g"
.url = "./../g",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/g" }
},{ // "./g/." = "http://a/b/c/g/"
.url = "./g/.",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g/" }
},{ // "g/./h" = "http://a/b/c/g/h"
.url = "g/./h",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g/h" }
},{ // "g/../h" = "http://a/b/c/h"
.url = "g/../h",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/h" }
},{ // "g;x=1/./y" = "http://a/b/c/g;x=1/y"
.url = "g;x=1/./y",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g;x=1/y" }
},{ // "g;x=1/../y" = "http://a/b/c/y"
.url = "g;x=1/../y",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/y" }
},{ // "g?y/./x" = "http://a/b/c/g?y/./x"
.url = "g?y/./x",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g", .enc_query = "y/./x" }
},{ // "g?y/../x" = "http://a/b/c/g?y/../x"
.url = "g?y/../x",
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed = { .host_name = "a", .path = "/b/c/g", .enc_query = "y/../x" }
},{ // "g#s/./x" = "http://a/b/c/g#s/./x"
.url = "g#s/./x",
.flags = HTTP_URL_ALLOW_FRAGMENT_PART,
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed =
{ .host_name = "a", .path = "/b/c/g", .enc_fragment = "s/./x" }
},{ // "g#s/../x" = "http://a/b/c/g#s/../x"
.url = "g#s/../x",
.flags = HTTP_URL_ALLOW_FRAGMENT_PART,
.url_base = { .host_name = "a", .path = "/b/c/d;p", .enc_query = "q" },
.url_parsed =
{ .host_name = "a", .path = "/b/c/g", .enc_fragment = "s/../x" }
}
};
static unsigned int valid_url_test_count = N_ELEMENTS(valid_url_tests);
static void test_http_url_valid(void)
{
unsigned int i;
for (i = 0; i < valid_url_test_count; i++) T_BEGIN {
const char *url = valid_url_tests[i].url;
enum http_url_parse_flags flags = valid_url_tests[i].flags;
struct http_url *urlt = &valid_url_tests[i].url_parsed;
struct http_url *urlb = &valid_url_tests[i].url_base;
struct http_url *urlp;
const char *error = NULL;
test_begin(t_strdup_printf("http url valid [%d]", i));
if (urlb->host_name == NULL) urlb = NULL;
if (http_url_parse(url, urlb, flags, &urlp, &error) < 0)
urlp = NULL;
test_out_reason(t_strdup_printf("http_url_parse(%s)",
valid_url_tests[i].url), urlp != NULL, error);
if (urlp != NULL) {
if (urlp->host_name == NULL || urlt->host_name == NULL) {
test_out(t_strdup_printf("url->host_name = %s", urlp->host_name),
urlp->host_name == urlt->host_name);
} else {
test_out(t_strdup_printf("url->host_name = %s", urlp->host_name),
strcmp(urlp->host_name, urlt->host_name) == 0);
}
if (!urlp->have_port) {
test_out("url->port = (unspecified)",
urlp->have_port == urlt->have_port);
} else {
test_out(t_strdup_printf("url->port = %u", urlp->port),
urlp->have_port == urlt->have_port && urlp->port == urlt->port);
}
if (!urlp->have_host_ip) {
test_out("url->host_ip = (unspecified)",
urlp->have_host_ip == urlt->have_host_ip);
} else {
test_out("url->host_ip = (valid)",
urlp->have_host_ip == urlt->have_host_ip);
}
if (urlp->path == NULL || urlt->path == NULL) {
test_out(t_strdup_printf("url->path = %s", urlp->path),
urlp->path == urlt->path);
} else {
test_out(t_strdup_printf("url->path = %s", urlp->path),
strcmp(urlp->path, urlt->path) == 0);
}
if (urlp->enc_query == NULL || urlt->enc_query == NULL) {
test_out(t_strdup_printf(
"url->enc_query = %s", urlp->enc_query),
urlp->enc_query == urlt->enc_query);
} else {
test_out(t_strdup_printf(
"url->enc_query = %s", urlp->enc_query),
strcmp(urlp->enc_query, urlt->enc_query) == 0);
}
if (urlp->enc_fragment == NULL || urlt->enc_fragment == NULL) {
test_out(t_strdup_printf(
"url->enc_fragment = %s", urlp->enc_fragment),
urlp->enc_fragment == urlt->enc_fragment);
} else {
test_out(t_strdup_printf(
"url->enc_fragment = %s", urlp->enc_fragment),
strcmp(urlp->enc_fragment, urlt->enc_fragment) == 0);
}
}
test_end();
} T_END;
}
struct invalid_http_url_test {
const char *url;
enum http_url_parse_flags flags;
struct http_url url_base;
};
static struct invalid_http_url_test invalid_url_tests[] = {
{
.url = "imap://example.com/INBOX"
},{
.url = "http:/www.example.com"
},{
.url = ""
},{
.url = "/index.html"
},{
.url = "http://www.example.com/index.html\""
},{
.url = "http:///dovecot.org"
},{
.url = "http://[]/index.html"
},{
.url = "http://[v08.234:232:234:234:2221]/index.html"
#ifdef HAVE_IPV6
},{
.url = "http://[1::34a:34:234::6]/index.html"
#endif
},{
.url = "http://example%a.com/index.html"
},{
.url = "http://example.com%/index.html"
},{
.url = "http://example%00.com/index.html"
},{
.url = "http://example.com:65539/index.html"
},{
.url = "http://example.com/settings/%00/"
},{
.url = "http://example.com/settings/%0r/"
},{
.url = "http://example.com/settings/misc/%/"
},{
.url = "http://example.com/?%00"
},{
.url = "http://www.example.com/network.html#IMAP_Server"
},{
.url = "http://example.com/#%00",
.flags = HTTP_URL_ALLOW_FRAGMENT_PART
}
};
static unsigned int invalid_url_test_count = N_ELEMENTS(invalid_url_tests);
static void test_http_url_invalid(void)
{
unsigned int i;
for (i = 0; i < invalid_url_test_count; i++) T_BEGIN {
const char *url = invalid_url_tests[i].url;
enum http_url_parse_flags flags = invalid_url_tests[i].flags;
struct http_url *urlb = &invalid_url_tests[i].url_base;
struct http_url *urlp;
const char *error = NULL;
if (urlb->host_name == NULL)
urlb = NULL;
test_begin(t_strdup_printf("http url invalid [%d]", i));
if (http_url_parse(url, urlb, flags, &urlp, &error) < 0)
urlp = NULL;
test_out_reason(t_strdup_printf("parse %s", url), urlp == NULL, error);
test_end();
} T_END;
}
static const char *parse_create_url_tests[] = {
"http://www.example.com/",
"http://10.0.0.1/",
#ifdef HAVE_IPV6
"http://[::1]/",
#endif
"http://www.example.com:993/",
"http://www.example.com/index.html",
"http://www.example.com/settings/index.html",
"http://ww.%23example.com/",
"http://www.example.com/%23shared/news",
"http://www.example.com/query.php?name=Hendrik%20Visser",
"http://www.example.com/network.html#IMAP%20Server",
};
static unsigned int
parse_create_url_test_count = N_ELEMENTS(parse_create_url_tests);
static void test_http_url_parse_create(void)
{
unsigned int i;
for (i = 0; i < parse_create_url_test_count; i++) T_BEGIN {
const char *url = parse_create_url_tests[i];
struct http_url *urlp;
const char *error = NULL;
test_begin(t_strdup_printf("http url parse/create [%d]", i));
if (http_url_parse
(url, NULL, HTTP_URL_ALLOW_FRAGMENT_PART, &urlp, &error) < 0)
urlp = NULL;
test_out_reason(t_strdup_printf("parse %s", url), urlp != NULL, error);
if (urlp != NULL) {
const char *urlnew = http_url_create(urlp);
test_out(t_strdup_printf
("create %s", urlnew), strcmp(url, urlnew) == 0);
}
test_end();
} T_END;
}
int main(void)
{
static void (*test_functions[])(void) = {
test_http_url_valid,
test_http_url_invalid,
test_http_url_parse_create,
NULL
};
return test_run(test_functions);
}