Re: Cookie processing in Fast CGI

"Martin Chapman" <[email protected]>
Newsgroups gmane.comp.web.fastcgi.devel
Message-ID <58BC5E8025134A1E827A366E7A732327@chapmanm64>
Check out:

Http 1.0 master -
http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html

Http 1.1 master - http://www.w3.org/Protocols/rfc2616/rfc2616.html

Martin


-----Original Message-----
From: Tom Bowden [mailto:[email protected]] 
Sent: Thursday, December 10, 2009 1:17 PM
To: Rob Lemley
Cc: Martin Chapman; 'FastCGI Developers'
Subject: Re: [FASTCGI] Cookie processing in Fast CGI

The two rfc's you mention below are for Set-Cookie and Set-Cookie2.   
I presume the Set-Cookie2 is for sending multiple cookies in one  
header?  Is that widely accepted?

Also -- do you know which RFC includes the Content-Disposition spec?


On Dec 9, 2009, at 6:24 PM, Rob Lemley wrote:

> I'd recommend having rfc2109 and rfc2965 handy.
>
> Also note that the Content-Disposition header is very similar to the
> Cookie header, ie would be common code.
>
> Rob
>
>
> Tom Bowden wrote:
>> will post with pleasure.  Thanks!
>>
>> Tom
>>
>> On Dec 9, 2009, at 3:02 PM, Martin Chapman wrote:
>>
>>> Tom,
>>>
>>> It's a little ugly because it's COM and if you convert it to  
>>> FastCGI it
>>> would be cool if you posted it back for the rest of us if you  
>>> can.  The
>>> entire COM implementation is attached.
>>>
>>> General Gist:
>>>
>>> 1. Get the cookie from the env vars.  Should be called HTTP_COOKIE.
>>>
>>> 2. Use a method like the one below to parse the cookie value.
>>>
>>> STDMETHODIMP CCookie::ParseValue(BSTR sCookie)
>>> {
>>>     AFX_MANAGE_STATE(AfxGetStaticModuleState());
>>>
>>>     _bstr_t bstrCookie(sCookie);
>>>     if (bstrCookie.length() == 0)
>>>         return E_INVALIDARG;
>>>
>>>     CString strCookie = (TCHAR*) bstrCookie;
>>>     LPCSTR pEnd = strCookie;
>>>     LPCSTR pStart = strCookie;
>>>     CString name, value;
>>>
>>>     while (*pEnd != '\0')
>>>     {
>>>         while (*pEnd && *pEnd != '=' && *pEnd != '&')
>>>             pEnd++;
>>>
>>>         if (*pEnd == '\0' || *pEnd == '&')
>>>         {
>>>             if (pEnd > pStart)
>>>             {
>>>                 CopyToCString(value, pStart, pEnd);
>>>             }
>>>             put_Value(_bstr_t(value.GetBuffer()));
>>>             if (*pEnd == '&')
>>>             {
>>>                 pEnd++;
>>>                 pStart = pEnd;
>>>                 continue;
>>>             }
>>>             return S_OK;
>>>         }
>>>         else if (*pEnd == '=' )
>>>         {
>>>             if (pEnd > pStart)
>>>             {
>>>                 CopyToCString(name, pStart, pEnd);
>>>             }
>>>             else
>>>             {
>>>                 pEnd++;
>>>                 pStart = pEnd;
>>>                 break;
>>>             }
>>>
>>>             pEnd++;
>>>             pStart = pEnd;
>>>             while (*pEnd && *pEnd != '&' && *pEnd != '=')
>>>                 pEnd++;
>>>             if (pEnd > pStart)
>>>                 CopyToCString(value, pStart, pEnd);
>>>
>>>             AddValue(_bstr_t(name.GetBuffer()),
>>> _bstr_t(value.GetBuffer()));
>>>             if (*pEnd != '\0')
>>>                 pEnd++;
>>>
>>>             pStart = pEnd;
>>>         }
>>>     }
>>>
>>>     return S_OK;
>>> }
>>>
>>> 3. The following func parses a single cookie value and is used in  
>>> the
>>> func
>>> above.
>>>
>>> STDMETHODIMP CCookie::ParseValue(BSTR sCookie)
>>> {
>>>     AFX_MANAGE_STATE(AfxGetStaticModuleState());
>>>
>>>     _bstr_t bstrCookie(sCookie);
>>>     if (bstrCookie.length() == 0)
>>>         return E_INVALIDARG;
>>>
>>>     CString strCookie = (TCHAR*) bstrCookie;
>>>     LPCSTR pEnd = strCookie;
>>>     LPCSTR pStart = strCookie;
>>>     CString name, value;
>>>
>>>     while (*pEnd != '\0')
>>>     {
>>>         while (*pEnd && *pEnd != '=' && *pEnd != '&')
>>>             pEnd++;
>>>
>>>         if (*pEnd == '\0' || *pEnd == '&')
>>>         {
>>>             if (pEnd > pStart)
>>>             {
>>>                 CopyToCString(value, pStart, pEnd);
>>>             }
>>>             put_Value(_bstr_t(value.GetBuffer()));
>>>             if (*pEnd == '&')
>>>             {
>>>                 pEnd++;
>>>                 pStart = pEnd;
>>>                 continue;
>>>             }
>>>             return S_OK;
>>>         }
>>>         else
>>>         if (*pEnd == '=' )
>>>         {
>>>             if (pEnd > pStart)
>>>             {
>>>                 CopyToCString(name, pStart, pEnd);
>>>             }
>>>             else
>>>             {
>>>                 pEnd++;
>>>                 pStart = pEnd;
>>>                 break;
>>>             }
>>>
>>>             pEnd++;
>>>             pStart = pEnd;
>>>             while (*pEnd && *pEnd != '&' && *pEnd != '=')
>>>                 pEnd++;
>>>             if (pEnd > pStart)
>>>                 CopyToCString(value, pStart, pEnd);
>>>
>>>             AddValue(_bstr_t(name.GetBuffer()),
>>> _bstr_t(value.GetBuffer()));
>>>             if (*pEnd != '\0')
>>>                 pEnd++;
>>>
>>>             pStart = pEnd;
>>>         }
>>>     }
>>>
>>>     return S_OK;
>>> }
>>>
>>>
>>> -----Original Message-----
>>> From: fastcgi-developers-bounces 
>>> +chapmanm=pixia.com-xGejAJT2w6xVgU18Zptdi0EOCMrvLtNR@public.gmane.org
>>> [mailto:fastcgi-developers-bounces 
>>> +chapmanm=pixia.com-xGejAJT2w6xVgU18Zptdi0EOCMrvLtNR@public.gmane.org]
>>>
>>> On Behalf Of Tom Bowden
>>> Sent: Wednesday, December 09, 2009 1:18 PM
>>> To: FastCGI Developers
>>> Subject: [FASTCGI] Cookie processing in Fast CGI
>>>
>>> Is there a thread somewhere that talks about parsing cookies -  
>>> or, is
>>> this something that I have to treat like any other header parsing  
>>> task.
>>>
>>> Tom
>>>
>>> _______________________________________________
>>> FastCGI-developers mailing list
>>> FastCGI-developers-xGejAJT2w6xVgU18Zptdi0EOCMrvLtNR@public.gmane.org
>>> http://mailman.pins.net/mailman/listinfo.cgi/fastcgi- 
>>> developers<CookieCollection.h><Cookie.cpp><Cookie.h><CookieCollectio 
>>> n.cpp>
>>>
>>
>> _______________________________________________
>> FastCGI-developers mailing list
>> FastCGI-developers-xGejAJT2w6xVgU18Zptdi0EOCMrvLtNR@public.gmane.org
>> http://mailman.pins.net/mailman/listinfo.cgi/fastcgi-developers
>>
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.