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 >> >> >