Version 5.8.0
[yaz-moved-to-github.git] / src / uri.c
index ecf1adc..efa11bf 100644 (file)
--- a/src/uri.c
+++ b/src/uri.c
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2011 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /**
@@ -101,7 +101,7 @@ void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
     for(i = 0; name[i]; i++)
         sz += strlen(name[i]) + 3 + strlen(value[i]) * 3;
     *path = (char *) odr_malloc(o, sz);
-    
+
     for(i = 0; name[i]; i++)
     {
         size_t ilen;
@@ -132,6 +132,13 @@ int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
     {
         cp++;
         no++;
+        while (*cp && *cp != '=' && *cp != '&')
+        {
+            /* check that x-form names looks sane */
+            if (*cp <= ' ' || *cp >= 127)
+                return 0;
+            cp++;
+        }
     }
     *name = (char **) odr_malloc(o, no * sizeof(char*));
     *val = (char **) odr_malloc(o, no * sizeof(char*));
@@ -146,10 +153,7 @@ int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
         for (cp = path; *cp && *cp != '=' && *cp != '&'; cp++)
             ;
 
-        (*name)[no] = (char *) odr_malloc(o, (cp-path)+1);
-        memcpy((*name)[no], path, cp-path);
-        (*name)[no][cp-path] = '\0';
-
+        (*name)[no] = odr_strdupn(o, path, cp - path);
         path = cp;
         if (*path == '=')
         {
@@ -175,42 +179,6 @@ int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val)
     return no;
 }
 
-char *yaz_uri_val(const char *path, const char *name, ODR o)
-{
-    size_t nlen = strlen(name);
-    if (*path != '?')
-        return 0;
-    path++;
-    while (path && *path)
-    {
-        const char *p1 = strchr(path, '=');
-        if (!p1)
-            break;
-        if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen))
-        {
-            size_t i = 0;
-            char *ret;
-            
-            path = p1 + 1;
-            p1 = strchr(path, '&');
-            if (!p1)
-                p1 = strlen(path) + path;
-            ret = (char *) odr_malloc(o, p1 - path + 1);
-            while (*path && *path != '&')
-            {
-                size_t l = 3;
-                ret[i++] = decode_uri_char(path, &l);
-                path += l;
-            }
-            ret[i] = '\0';
-            return ret;
-        }
-        path = strchr(p1, '&');
-        if (path)
-            path++;
-    }
-    return 0;
-}
 
 /*
  * Local variables: