@@ -301,17 +301,112 @@ public void testNonAsciiPathRedirect() throws Exception {
301301 }
302302
303303 @ Test
304- public void testQueryString () throws Exception {
304+ public void testQueryStringTargetOnly () throws Exception {
305+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?je=2" , "/b/id=1" , "/c/id=1" , "je=2" );
306+ }
307+
308+ @ Test
309+ public void testQueryStringTargetOnlyQSA () throws Exception {
310+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?je=2 [QSA]" , "/b/id=1" , "/c/id=1" , "je=2" );
311+ }
312+
313+ @ Test
314+ public void testQueryStringTargetOnlyQSD () throws Exception {
315+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?je=2 [QSD]" , "/b/id=1" , "/c/id=1" , "je=2" );
316+ }
317+
318+ @ Test
319+ public void testQueryStringTargetOnlyQSAQSD () throws Exception {
320+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?je=2 [QSA,QSD]" , "/b/id=1" , "/c/id=1" , "je=2" );
321+ }
322+
323+ @ Test
324+ public void testQueryStringTargetOnlyQS () throws Exception {
305325 doTestRewrite ("RewriteRule ^/b/(.*) /c?$1" , "/b/id=1" , "/c" , "id=1" );
306326 }
307327
328+ @ Test
329+ public void testQueryStringTargetOnlyQSAQS () throws Exception {
330+ doTestRewrite ("RewriteRule ^/b/(.*) /c?$1 [QSA]" , "/b/id=1" , "/c" , "id=1" );
331+ }
332+
333+ @ Test
334+ public void testQueryStringTargetOnlyQSDQS () throws Exception {
335+ doTestRewrite ("RewriteRule ^/b/(.*) /c?$1 [QSD]" , "/b/id=1" , "/c" , "id=1" );
336+ }
337+
338+ @ Test
339+ public void testQueryStringTargetOnlyQSAQSDQS () throws Exception {
340+ doTestRewrite ("RewriteRule ^/b/(.*) /c?$1 [QSA,QSD]" , "/b/id=1" , "/c" , "id=1" );
341+ }
342+
343+ @ Test
344+ public void testQueryStringSourceOnly () throws Exception {
345+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1" , "/b/d?id=1" , "/c/d" , "id=1" );
346+ }
347+
348+ @ Test
349+ public void testQueryStringSourceOnlyQSA () throws Exception {
350+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1 [QSA]" , "/b/d?id=1" , "/c/d" , "id=1" );
351+ }
352+
353+ @ Test
354+ public void testQueryStringSourceOnlyQSD () throws Exception {
355+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1 [QSD]" , "/b/d?id=1" , "/c/d" , null );
356+ }
357+
358+ @ Test
359+ public void testQueryStringSourceOnlyQSAQSD () throws Exception {
360+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1 [QSA,QSD]" , "/b/d?id=1" , "/c/d" , null );
361+ }
362+
363+ @ Test
364+ public void testQueryStringSourceAndTarget () throws Exception {
365+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?id=1" , "/b/d?je=2" , "/c/d" , "id=1" );
366+ }
367+
368+ @ Test
369+ public void testQueryStringSourceAndTargetQSA () throws Exception {
370+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?id=1 [QSA]" , "/b/d?je=2" , "/c/d" , "id=1&je=2" );
371+ }
372+
373+ @ Test
374+ public void testQueryStringSourceAndTargetQSD () throws Exception {
375+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?id=1 [QSD]" , "/b/d?je=2" , "/c/d" , "id=1" );
376+ }
377+
378+ @ Test
379+ public void testQueryStringSourceAndTargetQSAQSD () throws Exception {
380+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?id=1 [QSA,QSD]" , "/b/d?je=2" , "/c/d" , "id=1" );
381+ }
382+
383+ @ Test
384+ public void testQueryStringEncoded01 () throws Exception {
385+ doTestRewrite ("RewriteCond %{QUERY_STRING} a=(.*)\n RewriteRule ^/b.*$ /%1 [QSD]" , "/b?a=c" , "/c" , null );
386+ }
387+
388+ @ Test
389+ public void testQueryStringEncoded02 () throws Exception {
390+ doTestRewrite ("RewriteCond %{QUERY_STRING} a=(.*)\n RewriteRule ^/b.*$ /z/%1 [QSD]" , "/b?a=%2e%2e%2fc%2faAbB" , "/z/%2e%2e%2fc%2faAbB" , null );
391+ }
392+
308393 @ Test
309394 public void testQueryStringRemove () throws Exception {
310- doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?" , "/b/d?=1" , "/c/d" , null );
395+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?" , "/b/d?id =1" , "/c/d" , null );
311396 }
312397
313398 @ Test
314399 public void testQueryStringRemove02 () throws Exception {
400+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1 [QSD]" , "/b/d?id=1" , "/c/d" , null );
401+ }
402+
403+ @ Test
404+ public void testQueryStringRemoveInvalid () throws Exception {
405+ doTestRewrite ("RewriteRule ^/b/(.*) /c/$1?" , "/b/d?=1" , "/c/d" , null );
406+ }
407+
408+ @ Test
409+ public void testQueryStringRemoveInvalid02 () throws Exception {
315410 doTestRewrite ("RewriteRule ^/b/(.*) /c/$1 [QSD]" , "/b/d?=1" , "/c/d" , null );
316411 }
317412
@@ -616,7 +711,7 @@ public void testUtf8FlagsRBNE() throws Exception {
616711 public void testFlagsNC () throws Exception {
617712 // https://bz.apache.org/bugzilla/show_bug.cgi?id=60116
618713 doTestRewrite ("RewriteCond %{QUERY_STRING} a=([a-z]*) [NC]\n " + "RewriteRule .* - [E=X-Test:%1]" , "/c?a=aAa" ,
619- "/c" , null , "aAa" );
714+ "/c" , "a=aAa" , "aAa" );
620715 }
621716
622717 @ Test
@@ -806,12 +901,16 @@ public void invoke(Request request, Response response) throws IOException, Servl
806901 // were written into the request target
807902 Assert .assertEquals (400 , rc );
808903 } else {
904+ // If there is an expected URI, the request should be successful
905+ Assert .assertEquals (200 , rc );
809906 String body = res .toString ();
810907 RequestDescriptor requestDesc = SnoopResult .parse (body );
811908 String requestURI = requestDesc .getRequestInfo ("REQUEST-URI" );
812909 Assert .assertEquals (expectedURI , requestURI );
813910
814- if (expectedQueryString != null ) {
911+ if (expectedQueryString == null ) {
912+ Assert .assertTrue (requestDesc .getParams ().isEmpty ());
913+ } else {
815914 String queryString = requestDesc .getRequestInfo ("REQUEST-QUERY-STRING" );
816915 Assert .assertEquals (expectedQueryString , queryString );
817916 }
0 commit comments