Hi, For info, Oleg was very helpful and has updated the 3 bugs: TestCookieManager#testCookiePolicyIgnore => https://issues.apache.org/jira/browse/HTTPCLIENT-1704 => Fixed in 4.5.2 TestCookieManager#testCookieOrdering1 => https://issues.apache.org/jira/browse/HTTPCLIENT-1705 => I mixed up between testCookiePolicy2109 and testCookieOrdering1, so I closed my bug after he reported an issue in my test case, we'll have to submit another test case for testCookiePolicy2109 TestCookieManager#testSendCookie2 => https://issues.apache.org/jira/browse/HTTPCLIENT-1706 => Not a bug as per RFC6265 contract, as Oleg nicely pointed at
------------------------------------------------------------------------------------------------------------------------------------------------ As the test case in question only assigns effective domain but does not assign the actual attribute value the RFC6265 policy rejects the coolie due to a requirement of section 4.1.2.3 4.1.2.3. ... If the server omits the Domain attribute, the user agent will return the cookie only to the origin server. WARNING: Some existing user agents treat an absent Domain attribute as if the Domain attribute were present and contained the current host name. For example, if example.com returns a Set- Cookie header without a Domain attribute, these user agent will erroneously send the cookie to www.example.com as well. The test case passes if the following line is added to the test setup cookie1.setAttribute(ClientCookie.DOMAIN_ATTR, ".apache.org"); ------------------------------------------------------------------------------------------------------------------------------------------------ Regards On Mon, Dec 14, 2015 at 9:41 PM, Philippe Mouawad < [email protected]> wrote: > Hello Oleg, > Thanks . > > Here it is: > > /* > * ==================================================================== > * Licensed to the Apache Software Foundation (ASF) under one > * or more contributor license agreements. See the NOTICE file > * distributed with this work for additional information > * regarding copyright ownership. The ASF licenses this file > * to you under the Apache License, Version 2.0 (the > * "License"); you may not use this file except in compliance > * with the License. You may obtain a copy of the License at > * > * http://www.apache.org/licenses/LICENSE-2.0 > * > * Unless required by applicable law or agreed to in writing, > * software distributed under the License is distributed on an > * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > * KIND, either express or implied. See the License for the > * specific language governing permissions and limitations > * under the License. > * ==================================================================== > * > * This software consists of voluntary contributions made by many > * individuals on behalf of the Apache Software Foundation. For more > * information on the Apache Software Foundation, please see > * <http://www.apache.org/>. > * > */ > package org.apache.http.client.protocol; > > import java.util.List; > > import org.apache.http.Header; > import org.apache.http.HttpResponse; > import org.apache.http.HttpResponseInterceptor; > import org.apache.http.HttpVersion; > import org.apache.http.client.CookieStore; > import org.apache.http.cookie.Cookie; > import org.apache.http.cookie.CookieOrigin; > import org.apache.http.cookie.CookieSpec; > import org.apache.http.cookie.SM; > import org.apache.http.impl.client.BasicCookieStore; > import org.apache.http.impl.cookie.DefaultCookieSpec; > import org.apache.http.message.BasicHttpResponse; > import org.apache.http.util.Asserts; > import org.junit.Assert; > import org.junit.Before; > import org.junit.Test; > > public class TestResponseProcessCookies { > > private CookieOrigin cookieOrigin; > private CookieSpec cookieSpec; > private CookieStore cookieStore; > > @Before > public void setUp() throws Exception { > this.cookieOrigin = new CookieOrigin("localhost", 80, "/", false); > this.cookieSpec = new DefaultCookieSpec(); > this.cookieStore = new BasicCookieStore(); > } > > @Test(expected=IllegalArgumentException.class) > public void testResponseParameterCheck() throws Exception { > final HttpClientContext context = HttpClientContext.create(); > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(null, context); > } > > @Test(expected=IllegalArgumentException.class) > public void testContextParameterCheck() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, null); > } > > @Test > public void testParseMultipleCookies() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "test1=1; comment=\"how,now\", > test2=2; version=1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertEquals(1, cookies.size()); > final Cookie cookie = cookies.get(0); > Assert.assertEquals(0, cookie.getVersion()); > Assert.assertEquals("name1", cookie.getName()); > Assert.assertEquals("value1", cookie.getValue()); > Assert.assertEquals("localhost", cookie.getDomain()); > Assert.assertEquals("/", cookie.getPath()); > > } > > @Test > public void testParseCookies() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "name1=value1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > List<Header> lstHdr = cookieSpec.formatCookies(cookies); > StringBuilder sbHdr = new StringBuilder(); > for (Header header : lstHdr) { > sbHdr.append(header.getValue()); > } > org.junit.Assert.assertEquals("test1=1; test2=2", > sbHdr.toString()); > } > @Test > public void testParseCookies2() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "test1=1;secure, > test2=2;secure"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > List<Header> lstHdr = cookieSpec.formatCookies(cookies); > StringBuilder sbHdr = new StringBuilder(); > for (Header header : lstHdr) { > sbHdr.append(header.getValue()); > } > org.junit.Assert.assertEquals("test1=1; test2=2", > sbHdr.toString()); > } > > @Test > public void testNoCookieOrigin() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "name1=value1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, null); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertEquals(0, cookies.size()); > } > > @Test > public void testNoCookieSpec() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "name1=value1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, null); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertEquals(0, cookies.size()); > } > > @Test > public void testNoCookieStore() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "name1=value1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, null); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertEquals(0, cookies.size()); > } > > @Test > public void testSetCookie2OverrideSetCookie() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE, "name1=value1"); > response.addHeader(SM.SET_COOKIE2, "name1=value2; Version=1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertEquals(1, cookies.size()); > final Cookie cookie = cookies.get(0); > Assert.assertEquals(1, cookie.getVersion()); > Assert.assertEquals("name1", cookie.getName()); > Assert.assertEquals("value2", cookie.getValue()); > Assert.assertEquals("localhost.local", cookie.getDomain()); > Assert.assertEquals("/", cookie.getPath()); > } > > @Test > public void testInvalidHeader() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE2, "name=value; Version=crap"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertTrue(cookies.isEmpty()); > } > > @Test > public void testCookieRejected() throws Exception { > final HttpResponse response = new > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); > response.addHeader(SM.SET_COOKIE2, "name=value; Domain= > www.somedomain.com; Version=1"); > > final HttpClientContext context = HttpClientContext.create(); > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, > this.cookieOrigin); > context.setAttribute(HttpClientContext.COOKIE_SPEC, > this.cookieSpec); > context.setAttribute(HttpClientContext.COOKIE_STORE, > this.cookieStore); > > final HttpResponseInterceptor interceptor = new > ResponseProcessCookies(); > interceptor.process(response, context); > > final List<Cookie> cookies = this.cookieStore.getCookies(); > Assert.assertNotNull(cookies); > Assert.assertTrue(cookies.isEmpty()); > } > > } > > > On Mon, Dec 14, 2015 at 9:34 PM, Oleg Kalnichevski <[email protected]> > wrote: > >> On Sun, 2015-12-13 at 22:28 +0100, Philippe Mouawad wrote: >> > Finally, for those 2 I am not sure as per RFC6265, to use them , put >> code >> > in org.apache.http.client.protocol.TestResponseProcessCookies. >> > They worked with HC3 but it does not mean they should work with HC4, >> but I >> > would like a confirmation: >> > >> >> I cannot get the tests to compile due to missing instance variables >> cookieOrigin, cookieSpec and cookieStore. I'll take another look if you >> post the complete class. >> >> Oleg >> >> >> > >> > @Test >> > public void testParseCookies() throws Exception { >> > final HttpResponse response = new >> > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); >> > response.addHeader(SM.SET_COOKIE, "name1=value1"); >> > >> > final HttpClientContext context = HttpClientContext.create(); >> > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, >> > this.cookieOrigin); >> > context.setAttribute(HttpClientContext.COOKIE_SPEC, >> > this.cookieSpec); >> > context.setAttribute(HttpClientContext.COOKIE_STORE, >> > this.cookieStore); >> > >> > final HttpResponseInterceptor interceptor = new >> > ResponseProcessCookies(); >> > interceptor.process(response, context); >> > >> > final List<Cookie> cookies = this.cookieStore.getCookies(); >> > List<Header> lstHdr = cookieSpec.formatCookies(cookies); >> > StringBuilder sbHdr = new StringBuilder(); >> > for (Header header : lstHdr) { >> > sbHdr.append(header.getValue()); >> > } >> > org.junit.Assert.assertEquals("test1=1; test2=2", >> sbHdr.toString()); >> > } >> > @Test >> > public void testParseCookies2() throws Exception { >> > final HttpResponse response = new >> > BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); >> > response.addHeader(SM.SET_COOKIE, "test1=1;secure, >> test2=2;secure"); >> > >> > final HttpClientContext context = HttpClientContext.create(); >> > context.setAttribute(HttpClientContext.COOKIE_ORIGIN, >> > this.cookieOrigin); >> > context.setAttribute(HttpClientContext.COOKIE_SPEC, >> > this.cookieSpec); >> > context.setAttribute(HttpClientContext.COOKIE_STORE, >> > this.cookieStore); >> > >> > final HttpResponseInterceptor interceptor = new >> > ResponseProcessCookies(); >> > interceptor.process(response, context); >> > >> > final List<Cookie> cookies = this.cookieStore.getCookies(); >> > List<Header> lstHdr = cookieSpec.formatCookies(cookies); >> > StringBuilder sbHdr = new StringBuilder(); >> > for (Header header : lstHdr) { >> > sbHdr.append(header.getValue()); >> > } >> > org.junit.Assert.assertEquals("test1=1; test2=2", >> sbHdr.toString()); >> > } >> > >> > Thanks >> > >> > On Sun, Dec 13, 2015 at 10:09 PM, Philippe Mouawad < >> > [email protected]> wrote: >> > >> > > Hi, >> > > Created https://issues.apache.org/jira/browse/HTTPCLIENT-1705 with a >> Test >> > > case in it to show issue with Domain starting with ".". >> > > >> > > >> > > Regards >> > > >> > > On Sun, Dec 13, 2015 at 9:50 PM, Philippe Mouawad < >> > > [email protected]> wrote: >> > > >> > >> Hi Oleg, >> > >> Created https://issues.apache.org/jira/browse/HTTPCLIENT-1705 to >> show >> > >> issue with Cookie Header ordering. >> > >> >> > >> Regards >> > >> >> > >> On Sun, Dec 13, 2015 at 9:30 PM, Philippe Mouawad < >> > >> [email protected]> wrote: >> > >> >> > >>> Hi, >> > >>> I created https://issues.apache.org/jira/browse/HTTPCLIENT-1704 >> with >> > >>> JUnit test case so that you understand the difference we have. >> > >>> >> > >>> Regards >> > >>> >> > >>> On Sat, Dec 5, 2015 at 1:26 PM, Oleg Kalnichevski <[email protected] >> > >> > >>> wrote: >> > >>> >> > >>>> On Fri, 2015-12-04 at 21:43 +0100, Philippe Mouawad wrote: >> > >>>> > Thanks Oleg. >> > >>>> > But look at >> > >>>> > >> > >>>> >> https://github.com/ubikloadpack/jmeter/blob/HC4_5/test/src/org/apache/jmeter/protocol/http/control/TestCookieManager.java#L368 >> > >>>> , >> > >>>> > it concerns IGNORE_POLICY >> > >>>> > >> > >>>> > I really think there is at least one bug. >> > >>>> > Regards >> > >>>> > >> > >>>> >> > >>>> Sure thing. All these issues may well be due to bugs in HC. Could >> you >> > >>>> please though reproduce them with unit tests that do not involve >> JMeter >> > >>>> specific code? >> > >>>> >> > >>>> Oleg >> > >>>> >> > >>>> >> > >>>> > On Wed, Dec 2, 2015 at 4:00 PM, Oleg Kalnichevski < >> [email protected]> >> > >>>> wrote: >> > >>>> > >> > >>>> > > On Wed, 2015-12-02 at 15:51 +0100, Philippe Mouawad wrote: >> > >>>> > > > Hi Oleg, >> > >>>> > > > Thanks for answer. >> > >>>> > > > >> > >>>> > > > Find my answers inline. >> > >>>> > > > Regards >> > >>>> > > > >> > >>>> > > > On Wed, Dec 2, 2015 at 3:36 PM, Oleg Kalnichevski < >> > >>>> [email protected]> >> > >>>> > > wrote: >> > >>>> > > > >> > >>>> > > > > On Tue, 2015-12-01 at 22:09 +0100, Philippe Mouawad wrote: >> > >>>> > > > > > Hello, >> > >>>> > > > > > Any answer on this question ? >> > >>>> > > > > > Thanks >> > >>>> > > > > > Regards >> > >>>> > > > > > >> > >>>> > > > > > On Sun, Nov 15, 2015 at 8:39 PM, Philippe Mouawad < >> > >>>> > > > > > [email protected]> wrote: >> > >>>> > > > > > >> > >>>> > > > > > > Hello, >> > >>>> > > > > > > We're in the process of migrating JMeter to last >> HttpClient >> > >>>> 4.5.1. >> > >>>> > > > > > > >> > >>>> > > > > > > We are now migrating the CookieManager to remove all >> > >>>> deprecated >> > >>>> > > code. >> > >>>> > > > > > > To test this class, we had a JUNIT class : >> > >>>> > > > > > > >> > >>>> > > > > > > >> > >>>> > > > > >> > >>>> > > >> > >>>> >> https://github.com/ubikloadpack/jmeter/blob/HC4_5/test/src/org/apache/jmeter/protocol/http/control/TestCookieManager.java >> > >>>> > > > > > > >> > >>>> > > > > > > Before migration, it was still testing HC3 version. >> > >>>> > > > > > > So we first switched to HC4.23 and noticed some >> failures: >> > >>>> > > > > > > >> > >>>> > > > > >> > >>>> > > > > I am confused. Are you using HC 4.2.3 or HC 4.5.1? >> > >>>> > > > >> > >>>> > > > >> > >>>> > > > As I wrote, first we switched our JUnit tests to use HC4 >> > >>>> Implementation >> > >>>> > > of >> > >>>> > > > CookieHandler and used 4.2.3, we got some failures compared >> to >> > >>>> HC3. >> > >>>> > > > >> > >>>> > > > Then we switched from HC 4.2.3 to HC 4.5.1 and got other >> failures >> > >>>> all >> > >>>> > > > detailed in initial mail. >> > >>>> > > > >> > >>>> > > > >> > >>>> > > > What policy does >> > >>>> > > > > CookeManager use internally? >> > >>>> > > > > >> > >>>> > > > It depends on tests, you can see in the code that depending >> on >> > >>>> test >> > >>>> > > method >> > >>>> > > > we set different Policy to test them. >> > >>>> > > > >> > >>>> > > >> > >>>> > > You ought to be using RFC6265 policy either in strict or >> relaxed >> > >>>> mode >> > >>>> > > and nothing else. All other policies have been marked as >> obsolete >> > >>>> and >> > >>>> > > have already been removed in 5.0 (trunk). >> > >>>> > > >> > >>>> > > Oleg >> > >>>> > > >> > >>>> > > >> > >>>> > > >> > >>>> >> --------------------------------------------------------------------- >> > >>>> > > 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] >> > >>>> >> > >>>> >> > >>> >> > >>> >> > >>> -- >> > >>> Cordialement. >> > >>> Philippe Mouawad. >> > >>> >> > >>> >> > >>> >> > >> >> > >> >> > >> -- >> > >> Cordialement. >> > >> Philippe Mouawad. >> > >> >> > >> >> > >> >> > > >> > > >> > > -- >> > > Cordialement. >> > > Philippe Mouawad. >> > > >> > > >> > > >> > >> > >> >> >> > > > -- > Cordialement. > Philippe Mouawad. > > > -- Cordialement. Philippe Mouawad.
