X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Furl.c;h=8475a85f378498835509117b51c5b35362f208eb;hb=e828732528e0ed88973dd18f2dee97a42c0b4e59;hp=105c7dd019e9f9d3c2de55a711b5cbd6eba390f8;hpb=26deef20888cd415ad2f0261cfa25ba58a0dfebb;p=libucw.git diff --git a/lib/url.c b/lib/url.c index 105c7dd0..8475a85f 100644 --- a/lib/url.c +++ b/lib/url.c @@ -11,9 +11,8 @@ * * o Escaping of special characters still follows RFC 1738. * o Interpretation of path parameters follows RFC 1808. - * o Parsing a relative URL "x" wrt. base "http://hell.org?y" - * gives an error, which might be wrong. However, I failed - * to find any rule applying to this case in the RFC. + * + * XXX: The buffer handling in this module is really horrible, but it works. */ #include "lib/lib.h" @@ -369,8 +368,7 @@ url_normalize(struct url *u, struct url *b) int err; /* Basic checks */ - if (url_proto_path_flags[u->protoid] && !u->host || - u->host && !*u->host || + if (url_proto_path_flags[u->protoid] && (!u->host || !*u->host) || !u->host && u->user || !u->user && u->pass || !u->rest) @@ -396,6 +394,18 @@ url_normalize(struct url *u, struct url *b) } } + /* Change path "?" to "/?" because it's the true meaning */ + if (u->rest[0] == '?') + { + int l = strlen(u->rest); + if (u->bufend - u->buf < l+1) + return URL_ERR_TOO_LONG; + u->buf[0] = '/'; + memcpy(u->buf+1, u->rest, l+1); + u->rest = u->buf; + u->buf += l+2; + } + /* Fill in missing info */ if (u->port == ~0U) u->port = std_ports[u->protoid];