@@ -126,6 +126,62 @@ void testAddCookies() throws Exception {
126126 Assertions .assertFalse (cookieOrigin .isSecure ());
127127 }
128128
129+ @ Test
130+ void testAddCookiesWithQueryParams () throws Exception {
131+ final BasicCookieStore store = new BasicCookieStore ();
132+ final BasicClientCookie cookie = new BasicClientCookie ("name" , "value" );
133+ cookie .setDomain ("localhost.local" );
134+ cookie .setPath ("/stuff" );
135+ store .addCookie (cookie );
136+
137+ final HttpRequest request = new BasicHttpRequest ("GET" , "/stuff?foo=bar" );
138+ final HttpRoute route = new HttpRoute (this .target , null , false );
139+
140+ final HttpClientContext context = HttpClientContext .create ();
141+ context .setRoute (route );
142+ context .setCookieStore (store );
143+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
144+
145+ final HttpRequestInterceptor interceptor = RequestAddCookies .INSTANCE ;
146+ interceptor .process (request , null , context );
147+
148+ final Header [] headers = request .getHeaders ("Cookie" );
149+ Assertions .assertNotNull (headers );
150+ Assertions .assertEquals (1 , headers .length );
151+ Assertions .assertEquals ("name=value" , headers [0 ].getValue ());
152+
153+ final CookieOrigin cookieOrigin = context .getCookieOrigin ();
154+ Assertions .assertEquals ("/stuff" , cookieOrigin .getPath ());
155+ }
156+
157+ @ Test
158+ void testAddCookiesWithFragment () throws Exception {
159+ final BasicCookieStore store = new BasicCookieStore ();
160+ final BasicClientCookie cookie = new BasicClientCookie ("name" , "value" );
161+ cookie .setDomain ("localhost.local" );
162+ cookie .setPath ("/stuff" );
163+ store .addCookie (cookie );
164+
165+ final HttpRequest request = new BasicHttpRequest ("GET" , "/stuff#section" );
166+ final HttpRoute route = new HttpRoute (this .target , null , false );
167+
168+ final HttpClientContext context = HttpClientContext .create ();
169+ context .setRoute (route );
170+ context .setCookieStore (store );
171+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
172+
173+ final HttpRequestInterceptor interceptor = RequestAddCookies .INSTANCE ;
174+ interceptor .process (request , null , context );
175+
176+ final Header [] headers = request .getHeaders ("Cookie" );
177+ Assertions .assertNotNull (headers );
178+ Assertions .assertEquals (1 , headers .length );
179+ Assertions .assertEquals ("name=value" , headers [0 ].getValue ());
180+
181+ final CookieOrigin cookieOrigin = context .getCookieOrigin ();
182+ Assertions .assertEquals ("/stuff" , cookieOrigin .getPath ());
183+ }
184+
129185 @ Test
130186 void testCookiesForConnectRequest () throws Exception {
131187 final HttpRequest request = new BasicHttpRequest ("CONNECT" , "www.somedomain.com" );
@@ -432,5 +488,133 @@ void testSkipAddingCookiesWhenCookieHeaderPresent() throws Exception {
432488 Assertions .assertEquals (1 , headers .length );
433489 Assertions .assertEquals ("existingCookie=existingValue" , headers [0 ].getValue ());
434490 }
491+ @ Test
492+ void testAddCookiesWithRequestPathContainingQuery () throws Exception {
493+ final HttpRequest request = new BasicHttpRequest ("GET" , "/stuff?foo=bar" );
494+
495+ final HttpRoute route = new HttpRoute (this .target , null , false );
496+
497+ final CookieStore store = new BasicCookieStore ();
498+ final BasicClientCookie cookie = new BasicClientCookie ("name" , "value" );
499+ cookie .setDomain ("localhost.local" );
500+ cookie .setPath ("/stuff" );
501+ store .addCookie (cookie );
502+
503+ final HttpClientContext context = HttpClientContext .create ();
504+ context .setRoute (route );
505+ context .setCookieStore (store );
506+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
507+
508+ final HttpRequestInterceptor interceptor = RequestAddCookies .INSTANCE ;
509+ interceptor .process (request , null , context );
510+
511+ final Header [] headers = request .getHeaders ("Cookie" );
512+ Assertions .assertNotNull (headers );
513+ Assertions .assertEquals (1 , headers .length );
514+ Assertions .assertEquals ("name=value" , headers [0 ].getValue ());
515+
516+ final CookieOrigin cookieOrigin = context .getCookieOrigin ();
517+ Assertions .assertNotNull (cookieOrigin );
518+ Assertions .assertEquals ("/stuff" , cookieOrigin .getPath ());
519+ }
520+
521+ @ Test
522+ void testAddCookiesWithRequestPathContainingFragment () throws Exception {
523+ final HttpRequest request = new BasicHttpRequest ("GET" , "/stuff#frag" );
524+
525+ final HttpRoute route = new HttpRoute (this .target , null , false );
526+
527+ final CookieStore store = new BasicCookieStore ();
528+ final BasicClientCookie cookie = new BasicClientCookie ("name" , "value" );
529+ cookie .setDomain ("localhost.local" );
530+ cookie .setPath ("/stuff" );
531+ store .addCookie (cookie );
532+
533+ final HttpClientContext context = HttpClientContext .create ();
534+ context .setRoute (route );
535+ context .setCookieStore (store );
536+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
537+
538+ final HttpRequestInterceptor interceptor = RequestAddCookies .INSTANCE ;
539+ interceptor .process (request , null , context );
540+
541+ final Header [] headers = request .getHeaders ("Cookie" );
542+ Assertions .assertNotNull (headers );
543+ Assertions .assertEquals (1 , headers .length );
544+ Assertions .assertEquals ("name=value" , headers [0 ].getValue ());
545+
546+ final CookieOrigin cookieOrigin = context .getCookieOrigin ();
547+ Assertions .assertNotNull (cookieOrigin );
548+ Assertions .assertEquals ("/stuff" , cookieOrigin .getPath ());
549+ }
550+
551+ @ Test
552+ void testAddCookiesWithRootPathQuery () throws Exception {
553+ // Should behave as path "/" (query ignored)
554+ final HttpRequest request = new BasicHttpRequest ("GET" , "/?foo=bar" );
555+
556+ final HttpRoute route = new HttpRoute (this .target , null , false );
557+
558+ final HttpClientContext context = HttpClientContext .create ();
559+ context .setRoute (route );
560+ context .setCookieStore (this .cookieStore ); // setup cookies are path "/"
561+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
562+
563+ final HttpRequestInterceptor interceptor = RequestAddCookies .INSTANCE ;
564+ interceptor .process (request , null , context );
565+
566+ final Header [] headers = request .getHeaders ("Cookie" );
567+ Assertions .assertNotNull (headers );
568+ Assertions .assertEquals (1 , headers .length );
569+ Assertions .assertEquals ("name1=value1; name2=value2" , headers [0 ].getValue ());
570+
571+ final CookieOrigin cookieOrigin = context .getCookieOrigin ();
572+ Assertions .assertNotNull (cookieOrigin );
573+ Assertions .assertEquals ("/" , cookieOrigin .getPath ());
574+ }
575+
576+
577+ @ Test
578+ void testCookieOriginPathNormalization () throws Exception {
579+ final String [][] cases = new String [][]{
580+ {"" , "/" },
581+ {" " , "/" },
582+ {"\t " , "/" },
583+ {"?" , "/" },
584+ {"#" ,"/" },
585+ {"?foo" , "/" },
586+ {"#frag" , "/" },
587+ {"/" , "/" },
588+ {"/?foo" , "/" },
589+ {"/#frag" , "/" },
590+ {"/stuff" , "/stuff" },
591+ {"/stuff?foo" , "/stuff" },
592+ {"/stuff#frag" , "/stuff" },
593+ {"/stuff?foo#bar" , "/stuff" },
594+ {"/stuff#bar?foo" , "/stuff" },
595+ {"/stuff/" , "/stuff/" },
596+ {"/stuff/?foo" , "/stuff/" },
597+ };
598+
599+ for (final String [] c : cases ) {
600+ final String input = c [0 ];
601+ final String expected = c [1 ];
602+
603+ final HttpRequest request = new BasicHttpRequest ("GET" , input );
604+ final HttpRoute route = new HttpRoute (this .target , null , false );
605+
606+ final HttpClientContext context = HttpClientContext .create ();
607+ context .setRoute (route );
608+ context .setCookieStore (new BasicCookieStore ());
609+ context .setCookieSpecRegistry (this .cookieSpecRegistry );
610+
611+ RequestAddCookies .INSTANCE .process (request , null , context );
612+
613+ final CookieOrigin origin = context .getCookieOrigin ();
614+ Assertions .assertNotNull (origin , "input=" + input );
615+ Assertions .assertEquals (expected , origin .getPath (), "input=" + input );
616+ }
617+ }
618+
435619
436620}
0 commit comments