]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/url.c
ucw docs: Documented mempools
[libucw.git] / ucw / url.c
index 75b96b063fc2b890a87a3d93fafdc0b3c6cafedb..7145af5f764e80b9b9ed60cd223743a76093b008 100644 (file)
--- a/ucw/url.c
+++ b/ucw/url.c
@@ -7,11 +7,6 @@
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
  *
- *     The URL syntax corresponds to RFC 2396 with several exceptions:
- *
- *        o  Escaping of special characters still follows RFC 1738.
- *        o  Interpretation of path parameters follows RFC 1808.
- *
  *     XXX: The buffer handling in this module is really horrible, but it works.
  */
 
@@ -19,6 +14,7 @@
 #include "ucw/url.h"
 #include "ucw/chartype.h"
 #include "ucw/conf.h"
+#include "ucw/prime.h"
 
 #include <string.h>
 #include <stdlib.h>
@@ -94,6 +90,12 @@ url_deescape(const char *s, char *d)
              val = NCC_AND; break;
            case '#':
              val = NCC_HASH; break;
+           case '$':
+             val = NCC_DOLLAR; break;
+           case '+':
+             val = NCC_PLUS; break;
+           case ',':
+             val = NCC_COMMA; break;
            }
          *d++ = val;
          s += 3;
@@ -132,12 +134,12 @@ url_enescape(const char *s, char *d)
     {
       if (d >= end)
        return URL_ERR_TOO_LONG;
-      if (Calnum(c) ||                                                 /* RFC 1738(2.2): Only alphanumerics ... */
-         c == '$' || c == '-' || c == '_' || c == '.' || c == '+' ||   /* ... and several other exceptions ... */
+      if (Calnum(c) ||                                                 /* RFC 2396 (2.1-2.3): Only alphanumerics ... */
+         c == '-' || c == '_' || c == '.' || c == '+' || c == '~' ||   /* ... and several other exceptions ... */
          c == '!' || c == '*' || c == '\'' || c == '(' || c == ')' ||
-         c == ',' ||
          c == '/' || c == '?' || c == ':' || c == '@' ||               /* ... and reserved chars used for reserved purpose */
-         c == '=' || c == '&' || c == '#' || c == ';')
+         c == '=' || c == '&' || c == '#' || c == ';' ||
+         c == '$' || c == '+' || c == ',')
        *d++ = *s++;
       else
        {
@@ -317,15 +319,9 @@ relpath_merge(struct url *u, struct url *b)
        ;
       goto copy;
     }
-  if (a[0] == ';')                     /* Change parameters */
-    {
-      for(p=o; *p && *p != ';' && *p != '?' && *p != '#'; p++)
-       ;
-      goto copy;
-    }
 
   p = NULL;                            /* Copy original path and find the last slash */
-  while (*o && *o != ';' && *o != '?' && *o != '#')
+  while (*o && *o != '?' && *o != '#')
     {
       if (d >= e)
        return URL_ERR_TOO_LONG;
@@ -609,7 +605,7 @@ int main(int argc, char **argv)
   char buf1[MAX_URL_SIZE], buf2[MAX_URL_SIZE], buf3[MAX_URL_SIZE], buf4[MAX_URL_SIZE];
   int err;
   struct url url, url0;
-  char *base = "http://mj@www.hell.org/123/sub_dir/index.html;param?query&zzz/subquery#fragment";
+  char *base = "http://mj@www.hell.org/123/sub_dir;param/index.html;param?query&zzz/sub;query+#fragment?";
 
   if (argc != 2 && argc != 3)
     return 1;