Hi James,
I am known as Cookie Taliban here for imposing strict, at times literal,
interpretation of cookie related RFCs ;-)
First off all, RFC 2965 has not been implemented yet, even though
HttpClient offers limited support for set-cookie2 headers.
Currently HttpClient per default uses RFC2109 compliant cookie
management. I just wonder if you have tried using the cookie
compatibility policy that Httpclient provides in addition to RFC2109
compliant and Netscape Draft compliant cookie specs? I does go lightly
on all sorts of non-compliant cookies
client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
It the compatibility policy does not yield desirable results, I'd
suggest writing a custom cookie spec class, rather than tweaking
HttpMethodBase class.
I'll look into RFC 2109 regarding the correct way invalid cookies should
be rejected
Cheers
Oleg
On Thu, 2003-02-13 at 20:30, Couball, James wrote:
> Hello All,
>
> I have a problem with my application of HTTPClient relating to the way that
> HttpMethodBase::ParseResponseHeaders handles rejecting cookies.
>
> My problem is that when one cookie in the set-cookie(2) header is considered
> invalid (call to parser.validate throws an exception) (because the domain is
> for a third party, for example) all cookies in the header that haven't been
> process are dropped. In my application, I want to reject cookies that don't
> match the domain and accept cookies that do match the domain. This problem
> can not be solved with a new cookie policy because the problem is in how
> HttpMethodBase::ParseResponseHeaders handles the exception thrown by
> parser.validate.
>
> RFC 2965 seems to suggest that accepting some cookies in the Set-Cookie2
> header and rejecting others is ok. See section 3.3.2: "To prevent possible
> security or privacy violations, a user agent rejects A COOKIE according to
> rules below." (emphasis is mine)
>
> In addition, IE and Netscape do accept all of the valid cookies on a
> Set-Cookie(2) header. What is a valid cookie to IE and Netscape depends on
> how you set the cookie policy within that program and is more complicated
> that what HttpClient currently supports.
>
> If this is a desired change, I have attached my implementation of
> HttpMethodBase::ParseResponseHeaders to be added to HttpClient. If
> requested, I can also provide a patch.
>
> Sincerely,
> James.
>
> protected void processResponseHeaders(HttpState state,
> HttpConnection conn) {
> LOG.trace("enter HttpMethodBase.processResponseHeaders(HttpState, "
> + "HttpConnection)");
>
> // add cookies, if any
> // should we set cookies?
> String cookieHeaderName = "set-cookie2";
> Header setCookieHeader = getResponseHeader(cookieHeaderName);
> if (null == setCookieHeader) { //ignore old-style if new is supported
> cookieHeaderName = "set-cookie";
> setCookieHeader = getResponseHeader(cookieHeaderName);
> }
>
> if (setCookieHeader != null) {
>
> // Parse cookies -- an error parsing the set-cookie header dumps all
> // cookies in this header.
>
> CookieSpec parser =
> CookiePolicy.getSpecByPolicy(state.getCookiePolicy());
> Cookie[] cookies = null;
> try {
> cookies = parser.parse(
> conn.getHost(),
> conn.getPort(),
> getPath(),
> conn.isSecure(),
> setCookieHeader);
> }
> catch (MalformedCookieException e) {
> if (LOG.isWarnEnabled()) {
> LOG.warn("Could not parse " + cookieHeaderName + " header: \""
> + setCookieHeader.getValue()
> + "\". " + e.getMessage());
> }
> }
>
> // Validate cookies -- only valid cookies are added. Invalid cookies
> // are logged and ignored.
>
> if (cookies != null) {
> for (int i = 0; i < cookies.length; i++) {
> Cookie cookie = cookies[i];
> boolean accepted = true;
> try {
> parser.validate(
> conn.getHost(),
> conn.getPort(),
> getPath(),
> conn.isSecure(),
> cookie);
> }
> catch (MalformedCookieException e) {
> accepted = false;
> if (LOG.isWarnEnabled()) {
> LOG.warn("Cookie rejected: \""
> + parser.formatCookie(cookie)
> + "\". " + e.getMessage());
> }
> }
> if (accepted) {
> if (LOG.isDebugEnabled()) {
> LOG.debug("Cookie accepted: \""
> + parser.formatCookie(cookie) + "\"");
> }
> state.addCookie(cookie);
> }
> }
> }
> }
> }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]