X-Git-Url: http://sjero.net/git/?a=blobdiff_plain;f=src%2Furl.c;h=2453157a617d0b4df79afe57a607ccf7644d4d04;hb=a9a2b34b052cfa903462124f59fbfeed7eaf374b;hp=31614794cfd3411614b708939264653a1d284546;hpb=78a765739543d5ca3bc83ad70f5d391b9d2af4f5;p=wget diff --git a/src/url.c b/src/url.c index 31614794..2453157a 100644 --- a/src/url.c +++ b/src/url.c @@ -43,6 +43,10 @@ as that of the covered work. */ #include "url.h" #include "host.h" /* for is_valid_ipv6_address */ +#ifdef __VMS +#include "vms.h" +#endif /* def __VMS */ + #ifdef TESTING #include "test.h" #endif @@ -628,18 +632,20 @@ static const char *parse_errors[] = { #define PE_NO_ERROR 0 N_("No error"), #define PE_UNSUPPORTED_SCHEME 1 - N_("Unsupported scheme %s"), -#define PE_INVALID_HOST_NAME 2 + N_("Unsupported scheme %s"), /* support for format token only here */ +#define PE_MISSING_SCHEME 2 + N_("Scheme missing"), +#define PE_INVALID_HOST_NAME 3 N_("Invalid host name"), -#define PE_BAD_PORT_NUMBER 3 +#define PE_BAD_PORT_NUMBER 4 N_("Bad port number"), -#define PE_INVALID_USER_NAME 4 +#define PE_INVALID_USER_NAME 5 N_("Invalid user name"), -#define PE_UNTERMINATED_IPV6_ADDRESS 5 +#define PE_UNTERMINATED_IPV6_ADDRESS 6 N_("Unterminated IPv6 numeric address"), -#define PE_IPV6_NOT_SUPPORTED 6 +#define PE_IPV6_NOT_SUPPORTED 7 N_("IPv6 addresses not supported"), -#define PE_INVALID_IPV6_ADDRESS 7 +#define PE_INVALID_IPV6_ADDRESS 8 N_("Invalid IPv6 numeric address") }; @@ -649,7 +655,7 @@ static const char *parse_errors[] = { error, and if ERROR is not NULL, also set *ERROR to the appropriate error code. */ struct url * -url_parse (const char *url, int *error, struct iri *iri) +url_parse (const char *url, int *error, struct iri *iri, bool percent_encode) { struct url *u; const char *p; @@ -668,26 +674,36 @@ url_parse (const char *url, int *error, struct iri *iri) int port; char *user = NULL, *passwd = NULL; - char *url_encoded = NULL, *new_url = NULL; + const char *url_encoded = NULL; + char *new_url = NULL; int error_code; scheme = url_scheme (url); if (scheme == SCHEME_INVALID) { - error_code = PE_UNSUPPORTED_SCHEME; + if (url_has_scheme (url)) + error_code = PE_UNSUPPORTED_SCHEME; + else + error_code = PE_MISSING_SCHEME; goto error; } if (iri && iri->utf8_encode) { - url_unescape ((char *) url); - iri->utf8_encode = remote_to_utf8 (iri, url, (const char **) &new_url); + iri->utf8_encode = remote_to_utf8 (iri, iri->orig_url ? iri->orig_url : url, (const char **) &new_url); if (!iri->utf8_encode) new_url = NULL; + else + iri->orig_url = xstrdup (url); } - url_encoded = reencode_escapes (new_url ? new_url : url); + /* XXX XXX Could that change introduce (security) bugs ??? XXX XXX*/ + if (percent_encode) + url_encoded = reencode_escapes (new_url ? new_url : url); + else + url_encoded = new_url ? new_url : url; + p = url_encoded; if (new_url && url_encoded != new_url) @@ -898,7 +914,7 @@ url_parse (const char *url, int *error, struct iri *iri) if (url_encoded == url) u->url = xstrdup (url); else - u->url = url_encoded; + u->url = (char *) url_encoded; } return u; @@ -906,7 +922,7 @@ url_parse (const char *url, int *error, struct iri *iri) error: /* Cleanup in case of error: */ if (url_encoded && url_encoded != url) - xfree (url_encoded); + xfree ((char *) url_encoded); /* Transmit the error code to the caller, if the caller wants to know. */ @@ -1559,11 +1575,30 @@ url_file_name (const struct url *u) if ((opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct) && !(file_exists_p (fname) && !file_non_directory_p (fname))) - return fname; + { + unique = fname; + } + else + { + unique = unique_name (fname, true); + if (unique != fname) + xfree (fname); + } + +/* On VMS, alter the name as required. */ +#ifdef __VMS + { + char *unique2; + + unique2 = ods_conform( unique); + if (unique2 != unique) + { + xfree (unique); + unique = unique2; + } + } +#endif /* def __VMS */ - unique = unique_name (fname, true); - if (unique != fname) - xfree (fname); return unique; } @@ -2001,12 +2036,12 @@ schemes_are_similar_p (enum url_scheme a, enum url_scheme b) static int getchar_from_escaped_string (const char *str, char *c) -{ +{ const char *p = str; assert (str && *str); assert (c); - + if (p[0] == '%') { if (!c_isxdigit(p[1]) || !c_isxdigit(p[2])) @@ -2056,7 +2091,7 @@ are_urls_equal (const char *u1, const char *u2) p += pp; q += qq; } - + return (*p == 0 && *q == 0 ? true : false); } @@ -2165,7 +2200,7 @@ test_append_uri_pathel() } test_array[] = { { "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) { struct growable dest;