Commit 18c735e7 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

cookies: allow spaces in cookie names, cut of trailing spaces

It turns out Firefox and Chrome both allow spaces in cookie names and
there are sites out there using that.

Turned out the code meant to strip off trailing space from cookie names
didn't work. Fixed now.

Test case 8 modified to verify both these changes.

Closes #639
parent c4303fd5
Loading
Loading
Loading
Loading
+16 −7
Original line number Original line Diff line number Diff line
@@ -5,7 +5,7 @@
 *                            | (__| |_| |  _ <| |___
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *                             \___|\___/|_| \_\_____|
 *
 *
 * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 *
 * This software is licensed as described in the file COPYING, which
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * you should have received as part of this distribution. The terms
@@ -427,15 +427,24 @@ Curl_cookie_add(struct SessionHandle *data,
        bool done = FALSE;
        bool done = FALSE;
        bool sep;
        bool sep;
        size_t len=strlen(what);
        size_t len=strlen(what);
        const char *endofn = &ptr[ strlen(name) ];
        size_t nlen = strlen(name);

        const char *endofn = &ptr[ nlen ];
        /* skip trailing spaces in name */
        while(*endofn && ISBLANK(*endofn))
          endofn++;


        /* name ends with a '=' ? */
        /* name ends with a '=' ? */
        sep = (*endofn == '=')?TRUE:FALSE;
        sep = (*endofn == '=')?TRUE:FALSE;


        if(nlen) {
          endofn--; /* move to the last character */
          if(ISBLANK(*endofn)) {
            /* skip trailing spaces in name */
            while(*endofn && ISBLANK(*endofn) && nlen) {
              endofn--;
              nlen--;
            }
            name[nlen]=0; /* new end of name */
          }
        }

        /* Strip off trailing whitespace from the 'what' */
        /* Strip off trailing whitespace from the 'what' */
        while(len && ISBLANK(what[len-1])) {
        while(len && ISBLANK(what[len-1])) {
          what[len-1]=0;
          what[len-1]=0;
+3 −1
Original line number Original line Diff line number Diff line
@@ -41,6 +41,8 @@ Set-Cookie: partmatch=present; domain=.0.0.1; path=/w;
Set-Cookie: duplicate=test; domain=.0.0.1; domain=.0.0.1; path=/donkey;
Set-Cookie: duplicate=test; domain=.0.0.1; domain=.0.0.1; path=/donkey;
Set-Cookie: cookie=yes; path=/we;
Set-Cookie: cookie=yes; path=/we;
Set-Cookie: cookie=perhaps; path=/we/want;
Set-Cookie: cookie=perhaps; path=/we/want;
Set-Cookie: name with space=is weird but; path=/we/want;
Set-Cookie: trailingspace    = removed; path=/we/want;
Set-Cookie: nocookie=yes; path=/WE;
Set-Cookie: nocookie=yes; path=/WE;
Set-Cookie: blexp=yesyes; domain=%HOSTIP; domain=%HOSTIP; expiry=totally bad;
Set-Cookie: blexp=yesyes; domain=%HOSTIP; domain=%HOSTIP; expiry=totally bad;
Set-Cookie: partialip=nono; domain=.0.0.1;
Set-Cookie: partialip=nono; domain=.0.0.1;
@@ -60,7 +62,7 @@ perl -e 'if ("%HOSTIP" !~ /\.0\.0\.1$/) {print "Test only works for HOSTIPs endi
GET /we/want/8 HTTP/1.1
GET /we/want/8 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Host: %HOSTIP:%HTTPPORT
Accept: */*
Accept: */*
Cookie: cookie=perhaps; cookie=yes; foobar=name; blexp=yesyes
Cookie: cookie=perhaps; name with space=is weird but; trailingspace=removed; cookie=yes; foobar=name; blexp=yesyes


</protocol>
</protocol>
</verify>
</verify>