[FASTCGI] Cookie processing in Fast CGI

Rob Lemley rclemley at booksys.com
Wed Dec 9 19:24:31 EST 2009


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 at mailman.fastcgi.com
>> [mailto:fastcgi-developers-bounces+chapmanm=pixia.com at mailman.fastcgi.com]
>>
>> 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 at mailman.fastcgi.com
>> http://mailman.pins.net/mailman/listinfo.cgi/fastcgi-developers<CookieCollection.h><Cookie.cpp><Cookie.h><CookieCollection.cpp>
>>
>
> _______________________________________________
> FastCGI-developers mailing list
> FastCGI-developers at mailman.fastcgi.com
> http://mailman.pins.net/mailman/listinfo.cgi/fastcgi-developers
>
>



More information about the FastCGI-developers mailing list