]> granicus.if.org Git - curl/commitdiff
cookies: first n/v pair in Set-Cookie: is the cookie, then parameters
authorDaniel Stenberg <daniel@haxx.se>
Thu, 10 Mar 2016 10:20:56 +0000 (11:20 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 10 Mar 2016 10:26:12 +0000 (11:26 +0100)
RFC 6265 section 4.1.1 spells out that the first name/value pair in the
header is the actual cookie name and content, while the following are
the parameters.

libcurl previously had a more liberal approach which causes significant
problems when introducing new cookie parameters, like the suggested new
cookie priority draft.

The previous logic read all n/v pairs from left-to-right and the first
name used that wassn't a known parameter name would be used as the
cookie name, thus accepting "Set-Cookie: Max-Age=2; person=daniel" to be
a cookie named 'person' while an RFC 6265 compliant parser should
consider that to be a cookie named 'Max-Age' with an (unknown) parameter
'person'.

Fixes #709

lib/cookie.c
tests/data/test1218
tests/data/test27

index de871b75ee137f0ab2a7bea8446d597df1608014..1f2239242864f616ba7fac3b4a9b2d57e9923f57 100644 (file)
@@ -456,7 +456,16 @@ Curl_cookie_add(struct SessionHandle *data,
         while(*whatptr && ISBLANK(*whatptr))
           whatptr++;
 
-        if(!len) {
+        if(!co->name && sep) {
+          /* The very first name/value pair is the actual cookie name */
+          co->name = strdup(name);
+          co->value = strdup(whatptr);
+          if(!co->name || !co->value) {
+            badcookie = TRUE;
+            break;
+          }
+        }
+        else if(!len) {
           /* this was a "<name>=" with no content, and we must allow
              'secure' and 'httponly' specified this weirdly */
           done = TRUE;
@@ -550,14 +559,6 @@ Curl_cookie_add(struct SessionHandle *data,
             break;
           }
         }
-        else if(!co->name) {
-          co->name = strdup(name);
-          co->value = strdup(whatptr);
-          if(!co->name || !co->value) {
-            badcookie = TRUE;
-            break;
-          }
-        }
         /*
           else this is the second (or more) name we don't know
           about! */
index ee18cb52844ff4299d1cdff37eb7ad72a269a8f9..9c2fc0389a4404fc7b2ad919f11ebf465333629b 100644 (file)
@@ -14,7 +14,7 @@ cookies
 <data>
 HTTP/1.1 200 OK
 Date: Tue, 25 Sep 2001 19:37:44 GMT
-Set-Cookie: domain=.example.fake; bug=fixed;
+Set-Cookie: bug=fixed; domain=.example.fake;
 Content-Length: 21\r
 
 This server says moo
index 5ae2ffd4fd4bc30eb22d393d138063979b32eacc..6fed3d9949fd3b290d0b70dec268611c243bc71f 100644 (file)
@@ -11,7 +11,7 @@ cookies
 <data>
 HTTP/1.1 200 Mooo swsclose
 Connection: close
-Set-Cookie: path=/; thewinneris=nowayyouwin;
+Set-Cookie: thewinneris=nowayyouwin; path=/;
 Content-Length: 8
 
 *flopp*