[FASTCGI] Cookie processing in Fast CGI
Tom Bowden
charles_thomas at mac.com
Thu Dec 10 15:30:54 EST 2009
martin,
A couple questions (compiled from previous post with an addition):
I tend to use external libraries that make my life easier. Namely
jsoncpp and pcrecpp.
With pcrecpp i can (for example) replace the parsing the logic where
you're going character by character with something like:
#define PCRE_COOKIE_MASK "^Set-Cookie:[ \t]*([^=]+)=(.*)$"
and then:
std::string cookie_name;
std::string cookie_value;
if ( pcre_object->PartialMatch(instr, &cookie_name, &cookie_value) ) {
// do assignment logic...
}
Obviously some times its not good to rely on third party libs
(portability/etc). Is this one of those times? What would be most
useful to the community?
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>
More information about the FastCGI-developers
mailing list