curl_easy_escape: don't escape "unreserved" characters
authorDaniel Stenberg <daniel@haxx.se>
Tue, 28 Sep 2010 21:46:14 +0000 (23:46 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 28 Sep 2010 21:49:32 +0000 (23:49 +0200)
According to RFC3986 section 2.3 the letters -, ., _ and ~ should not be
percent-encoded.

Reported by: Miguel Diaz
Bug: http://curl.haxx.se/mail/lib-2010-09/0227.html

lib/escape.c
tests/data/test1015
tests/data/test58

index 37d21e7..735e1d8 100644 (file)
 #include "memdebug.h"
 
 /* Portable character check (remember EBCDIC). Do not use isalnum() because
-its behavior is altered by the current locale. */
-static bool Curl_isalnum(unsigned char in)
+   its behavior is altered by the current locale.
+   See http://tools.ietf.org/html/rfc3986#section-2.3
+*/
+static bool Curl_isunreserved(unsigned char in)
 {
   switch (in) {
     case '0': case '1': case '2': case '3': case '4':
@@ -59,6 +61,7 @@ static bool Curl_isalnum(unsigned char in)
     case 'K': case 'L': case 'M': case 'N': case 'O':
     case 'P': case 'Q': case 'R': case 'S': case 'T':
     case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':
+    case '-': case '.': case '_': case '~':
       return TRUE;
     default:
       break;
@@ -100,7 +103,7 @@ char *curl_easy_escape(CURL *handle, const char *string, int inlength)
   while(length--) {
     in = *string;
 
-    if (Curl_isalnum(in)) {
+    if (Curl_isunreserved(in)) {
       /* just copy this */
       ns[strindex++]=in;
     }
index cb916fd..c167466 100644 (file)
@@ -44,10 +44,10 @@ POST /1015 HTTP/1.1
 User-Agent: curl/7.17.2-CVS (i686-pc-linux-gnu) libcurl/7.17.2-CVS OpenSSL/0.9.8g zlib/1.2.3.3 c-ares/1.5.2-CVS libidn/1.1 libssh2/0.19.0-C\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
-Content-Length: 141\r
+Content-Length: 133\r
 Content-Type: application/x-www-form-urlencoded\r
 \r
-my%20name%20is%20moo%5B%5D&y e s=s%5Fi%5Fr&v_alue=content%20to%20%5F%3F%21%23%24%27%7C%3C%3E%0A&content%20to%20%5F%3F%21%23%24%27%7C%3C%3E%0A
+my%20name%20is%20moo%5B%5D&y e s=s_i_r&v_alue=content%20to%20_%3F%21%23%24%27%7C%3C%3E%0A&content%20to%20_%3F%21%23%24%27%7C%3C%3E%0A
 </protocol>
 </verify>
 </testcase>
index 82811df..1bd53fa 100644 (file)
@@ -39,7 +39,7 @@ a few bytes
 ^User-Agent:.*
 </strip>
 <protocol>
-PUT /we/want/58te%5B%5Dst%2Etxt HTTP/1.1\r
+PUT /we/want/58te%5B%5Dst.txt HTTP/1.1\r
 Host: %HOSTIP:%HTTPPORT\r
 Accept: */*\r
 Content-Length: 12\r