Hi, Regarding the other failing methods:
- testCookiePolicy2109 => Issue is in JMeter HC4 handler when we switch to/from org.apache.http.cookie.Cookie <=> org.apache.jmeter.protocol.http.control.Cookie. There is at least an issue with not testing: ((BasicClientCookie)cookie).containsAttribute(ClientCookie.PATH_ATTR), ((BasicClientCookie)cookie).containsAttribute(ClientCookie.DOMAIN_ATTR)); But I have not found yet the problem - testCookies1 => Same problem probably - testCookies2 => It appears test is wrong as per Oleg last answer. I think we need to fix CookieManager and upgrade to HC4.5.2 before releasing 2.14. Regards On Mon, Dec 14, 2015 at 9:55 PM, Philippe Mouawad < [email protected]> wrote: > 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. > > > -- Cordialement. Philippe Mouawad.
