* curl-shim.h, curl-shim.c (curl_escape, curl_free): Emulate
authorDavid Shaw <dshaw@jabberwocky.com>
Sat, 16 Apr 2005 22:21:28 +0000 (22:21 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Sat, 16 Apr 2005 22:21:28 +0000 (22:21 +0000)
curl_escape and curl_free.

keyserver/ChangeLog
keyserver/curl-shim.c
keyserver/curl-shim.h

index 2a9fa0c..84eec3a 100644 (file)
@@ -1,5 +1,8 @@
 2005-04-16  David Shaw  <dshaw@jabberwocky.com>
 
+       * curl-shim.h, curl-shim.c (curl_escape, curl_free): Emulate
+       curl_escape and curl_free.
+
        * gpgkeys_curl.c (main): If the http-proxy option is given without
        any arguments, try to get the proxy from the environment.
 
index 088d65f..f9ef61a 100644 (file)
@@ -151,3 +151,64 @@ CURLcode curl_easy_perform(CURL *curl)
 
   return handle_error(curl,err,errstr);
 }
+
+/* This is not the same exact set that is allowed according to
+   RFC-2396, but it is what the real curl uses. */
+#define VALID_URI_CHARS "abcdefghijklmnopqrstuvwxyz" \
+                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+                        "0123456789"
+
+char *curl_escape(char *str,int length)
+{
+  int len,max,idx,enc_idx=0;
+  char *enc;
+
+  if(length)
+    len=length;
+  else
+    len=strlen(str);
+
+  enc=malloc(len+1);
+  if(!enc)
+    return enc;
+
+  max=len;
+
+  for(idx=0;idx<len;idx++)
+    {
+      if(enc_idx+3>max)
+       {
+         char *tmp;
+
+         max+=100;
+
+         tmp=realloc(enc,max+1);
+         if(!tmp)
+           {
+             free(enc);
+             return NULL;
+           }
+
+         enc=tmp;
+       }
+
+      if(strchr(VALID_URI_CHARS,str[idx]))
+       enc[enc_idx++]=str[idx];
+      else
+       {
+         char numbuf[5];
+         sprintf(numbuf,"%%%02X",str[idx]);
+         strcpy(&enc[enc_idx],numbuf);
+         enc_idx+=3;
+       }
+    }
+
+  enc[enc_idx]='\0';
+
+  return enc;
+}
+
+void curl_free(char *ptr)
+{
+  free(ptr);
+}
index 906d434..dc3d959 100644 (file)
@@ -68,5 +68,7 @@ CURL *curl_easy_init(void);
 CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...);
 CURLcode curl_easy_perform(CURL *curl);
 void curl_easy_cleanup(CURL *curl);
+char *curl_escape(char *str,int len);
+void curl_free(char *ptr);
 
 #endif /* !_CURL_SHIM_H_ */