X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Furl.c;h=e44dfcd2313282426d68e5b5e8591682d7296df7;hp=afc31811d443378c7576a5eb17d6e919ba792298;hb=2e86829809c4a89eec3f13f8ad86a26c6c9c55de;hpb=fb0946c7fc6f1831894e8fd67389c0bc74a387b8 diff --git a/src/url.c b/src/url.c index afc31811..e44dfcd2 100644 --- a/src/url.c +++ b/src/url.c @@ -1,6 +1,7 @@ /* URL handling. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, + Inc. This file is part of GNU Wget. @@ -33,9 +34,7 @@ as that of the covered work. */ #include #include #include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #include #include @@ -463,6 +462,13 @@ url_has_scheme (const char *url) return *p == ':'; } +bool +url_valid_scheme (const char *url) +{ + enum url_scheme scheme = url_scheme (url); + return scheme != SCHEME_INVALID; +} + int scheme_default_port (enum url_scheme scheme) { @@ -624,7 +630,7 @@ init_seps (enum url_scheme scheme) *p++ = '?'; if (flags & scm_has_fragment) *p++ = '#'; - *p++ = '\0'; + *p = '\0'; return seps; } @@ -1432,7 +1438,7 @@ append_uri_pathel (const char *b, const char *e, bool escaped, } assert (q - TAIL (dest) == outlen); } - + /* Perform inline case transformation if required. */ if (opt.restrict_files_case == restrict_lowercase || opt.restrict_files_case == restrict_uppercase) @@ -1446,7 +1452,7 @@ append_uri_pathel (const char *b, const char *e, bool escaped, *q = c_toupper (*q); } } - + TAIL_INCR (dest, outlen); } @@ -1492,13 +1498,13 @@ append_dir_structure (const struct url *u, struct growable *dest) possible. Does not create directories on the file system. */ char * -url_file_name (const struct url *u) +url_file_name (const struct url *u, char *replaced_filename) { struct growable fnres; /* stands for "file name result" */ - const char *u_file, *u_query; + const char *u_file; char *fname, *unique; - char *index_filename = "index.html"; /* The default index file is index.html */ + const char *index_filename = "index.html"; /* The default index file is index.html */ fnres.base = NULL; fnres.size = 0; @@ -1507,7 +1513,7 @@ url_file_name (const struct url *u) /* If an alternative index file was defined, change index_filename */ if (opt.default_page) index_filename = opt.default_page; - + /* Start with the directory prefix, if specified. */ if (opt.dir_prefix) @@ -1547,18 +1553,28 @@ url_file_name (const struct url *u) append_dir_structure (u, &fnres); } - /* Add the file name. */ - if (fnres.tail) - append_char ('/', &fnres); - u_file = *u->file ? u->file : index_filename; - append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres); - - /* Append "?query" to the file name. */ - u_query = u->query && *u->query ? u->query : NULL; - if (u_query) + if (!replaced_filename) + { + /* Add the file name. */ + if (fnres.tail) + append_char ('/', &fnres); + u_file = *u->file ? u->file : index_filename; + append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres); + + /* Append "?query" to the file name, even if empty */ + if (u->query) + { + append_char (FN_QUERY_SEP, &fnres); + append_uri_pathel (u->query, u->query + strlen (u->query), + true, &fnres); + } + } + else { - append_char (FN_QUERY_SEP, &fnres); - append_uri_pathel (u_query, u_query + strlen (u_query), true, &fnres); + if (fnres.tail) + append_char ('/', &fnres); + u_file = replaced_filename; + append_uri_pathel (u_file, u_file + strlen (u_file), false, &fnres); } /* Zero-terminate the file name. */ @@ -2019,7 +2035,7 @@ url_string (const struct url *url, enum url_auth_mode auth_mode) } /* Return true if scheme a is similar to scheme b. - + Schemes are similar if they are equal. If SSL is supported, schemes are also similar if one is http (SCHEME_HTTP) and the other is https (SCHEME_HTTPS). */ @@ -2203,18 +2219,18 @@ test_append_uri_pathel() { "http://www.yoyodyne.com/path/", "somepage.html", false, "http://www.yoyodyne.com/path/somepage.html" }, }; - for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) + for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) { struct growable dest; const char *p = test_array[i].input; - + memset (&dest, 0, sizeof (dest)); - + append_string (test_array[i].original_url, &dest); append_uri_pathel (p, p + strlen(p), test_array[i].escaped, &dest); append_char ('\0', &dest); - mu_assert ("test_append_uri_pathel: wrong result", + mu_assert ("test_append_uri_pathel: wrong result", strcmp (dest.base, test_array[i].expected_result) == 0); } @@ -2237,10 +2253,10 @@ test_are_urls_equal() { "http://www.adomain.com/longer-path/", "http://www.adomain.com/path/", false }, { "http://www.adomain.com/path%2f", "http://www.adomain.com/path/", false }, }; - - for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) + + for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) { - mu_assert ("test_are_urls_equal: wrong result", + mu_assert ("test_are_urls_equal: wrong result", are_urls_equal (test_array[i].url1, test_array[i].url2) == test_array[i].expected_result); }