]> mj.ucw.cz Git - libucw.git/blobdiff - lib/url.c
`buckettool -c' (cat) now separates buckets by an empty line.
[libucw.git] / lib / url.c
index 105c7dd019e9f9d3c2de55a711b5cbd6eba390f8..8475a85f378498835509117b51c5b35362f208eb 100644 (file)
--- 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];