This is an automated email from the ASF dual-hosted git repository.

zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 3a25717  Add ability for TR to strip its special query params from 
responses (#6019)
3a25717 is described below

commit 3a25717ac1290daf33e869299e74394f6defae4e
Author: Rawlin Peters <[email protected]>
AuthorDate: Fri Jul 16 14:54:32 2021 -0600

    Add ability for TR to strip its special query params from responses (#6019)
    
    If enabled, strip the 'trred' and 'fakeClientIpAddress' query parameters
    from the response URL(s) returned in TR's response.
---
 CHANGELOG.md                                       |  1 +
 docs/source/admin/traffic_router.rst               |  3 +++
 .../traffic_router/core/router/TrafficRouter.java  | 28 ++++++++++++++++++++--
 .../core/router/TrafficRouterTest.java             | 15 ++++++++++++
 4 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f8c9b93..a1af1b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,7 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
 - Traffic Portal: Adds the ability for operations/admin users to create a 
CDN-level notification.
 - Traffic Portal: upgraded delivery service UI tables to use more 
powerful/performant ag-grid component
 - Traffic Router: added new 'dnssec.rrsig.cache.enabled' profile parameter to 
enable new DNSSEC RRSIG caching functionality. Enabling this greatly reduces 
CPU usage during the DNSSEC signing process.
+- Traffic Router: added new 'strip.special.query.params' profile parameter to 
enable stripping the 'trred' and 'fakeClientIpAddress' query parameters from 
responses: [#1065](https://github.com/apache/trafficcontrol/issues/1065)
 - [#5316](https://github.com/apache/trafficcontrol/issues/5316) - Add router 
host names and ports on a per interface basis, rather than a per server basis.
 - Traffic Ops: Adds API endpoints to fetch (GET), create (POST) or delete 
(DELETE) a cdn notification. Create and delete are limited to users with 
operations or admin role.
 - Added ACME certificate renewals and ACME account registration using external 
account binding
diff --git a/docs/source/admin/traffic_router.rst 
b/docs/source/admin/traffic_router.rst
index 299989e..8b30389 100644
--- a/docs/source/admin/traffic_router.rst
+++ b/docs/source/admin/traffic_router.rst
@@ -217,6 +217,9 @@ Much of a Traffic Router's configuration can be obtained 
through the :term:`Para
        | client.steering.forced.diversity        | CRConfig.json               
 | When this :term:`Parameter` exists and is exactly "true", it enables the 
"Client Steering Forced Diversity" feature to diversify      |
        |                                         |                             
 | CLIENT_STEERING results by including more unique :term:`Edge-tier cache 
servers` in the response to the client's request.             |
        
+-----------------------------------------+------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
+       | strip.special.query.params              | CRConfig.json               
 | If "true", Traffic Router will strip its special query parameters (namely 
"trred" and "fakeClientIpAddress") from its responses.      |
+       |                                         |                             
 | Note: the special query parameter "format" is not stripped due to its 
generality.                                                     |
+       
+-----------------------------------------+------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
        | tld.soa.expire                          | CRConfig.json               
 | The value for the "expire" field the Traffic Router DNS Server will respond 
with on :abbr:`SOA (Start of Authority)` records.         |
        
+-----------------------------------------+------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
        | tld.soa.minimum                         | CRConfig.json               
 | The value for the minimum field the Traffic Router DNS Server will respond 
with on :abbr:`SOA (Start of Authority)` records.          |
diff --git 
a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
 
b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
index 3c60cc7..4c71308 100644
--- 
a/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
+++ 
b/traffic_router/core/src/main/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouter.java
@@ -34,6 +34,7 @@ import 
org.apache.traffic_control.traffic_router.core.edge.Node;
 import org.apache.traffic_control.traffic_router.core.edge.Node.IPVersions;
 import 
org.apache.traffic_control.traffic_router.core.edge.TrafficRouterLocation;
 import org.apache.traffic_control.traffic_router.core.hash.ConsistentHasher;
+import org.apache.traffic_control.traffic_router.core.http.RouterFilter;
 import org.apache.traffic_control.traffic_router.core.loc.AnonymousIp;
 import 
org.apache.traffic_control.traffic_router.core.loc.AnonymousIpDatabaseService;
 import org.apache.traffic_control.traffic_router.core.loc.FederationRegistry;
@@ -58,6 +59,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.log4j.Logger;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
+import org.springframework.web.util.UriComponentsBuilder;
 import org.xbill.DNS.Name;
 import org.xbill.DNS.Type;
 import org.xbill.DNS.Zone;
@@ -105,6 +107,7 @@ public class TrafficRouter {
        public static final String DNSSEC_ENABLED = "dnssec.enabled";
        public static final String DNSSEC_ZONE_DIFFING = 
"dnssec.zone.diffing.enabled";
        public static final String DNSSEC_RRSIG_CACHE_ENABLED = 
"dnssec.rrsig.cache.enabled";
+       public static final String STRIP_SPECIAL_QUERY_PARAMS = 
"strip.special.query.params";
        private static final long DEFAULT_EDGE_NS_TTL = 3600;
        private static final int DEFAULT_EDGE_TR_LIMIT = 4;
 
@@ -117,6 +120,7 @@ public class TrafficRouter {
        private final boolean consistentDNSRouting;
        private final boolean clientSteeringDiversityEnabled;
        private final boolean dnssecZoneDiffingEnabled;
+       private final boolean stripSpecialQueryParamsEnabled;
        private final boolean edgeDNSRouting;
        private final boolean edgeHTTPRouting;
        private final long edgeNSttl; // 1 hour default
@@ -152,6 +156,7 @@ public class TrafficRouter {
                this.anonymousIpService = anonymousIpService;
                this.federationRegistry = federationRegistry;
                this.clientSteeringDiversityEnabled = 
JsonUtils.optBoolean(cr.getConfig(), CLIENT_STEERING_DIVERSITY);
+               this.stripSpecialQueryParamsEnabled = 
JsonUtils.optBoolean(cr.getConfig(), STRIP_SPECIAL_QUERY_PARAMS);
                this.dnssecZoneDiffingEnabled = 
JsonUtils.optBoolean(cr.getConfig(), DNSSEC_ENABLED) && 
JsonUtils.optBoolean(cr.getConfig(), DNSSEC_ZONE_DIFFING);
                this.consistentDNSRouting = 
JsonUtils.optBoolean(cr.getConfig(), "consistent.dns.routing"); // 
previous/default behavior
                this.edgeDNSRouting =  JsonUtils.optBoolean(cr.getConfig(), 
"edge.dns.routing") && cr.hasEdgeTrafficRouters();
@@ -1164,10 +1169,29 @@ public class TrafficRouter {
        public HTTPRouteResult route(final HTTPRequest request, final Track 
track) throws MalformedURLException, GeolocationException {
                track.setRouteType(RouteType.HTTP, request.getHostname());
 
+               final HTTPRouteResult result;
                if (isMultiRouteRequest(request)) {
-                       return multiRoute(request, track);
+                       result = multiRoute(request, track);
                } else {
-                       return singleRoute(request, track);
+                       result = singleRoute(request, track);
+               }
+               if (stripSpecialQueryParamsEnabled) {
+                   stripSpecialQueryParams(result);
+               }
+               return result;
+       }
+
+       public void stripSpecialQueryParams(final HTTPRouteResult result) 
throws MalformedURLException {
+               if (result != null && result.getUrls() != null) {
+                       for (int i = 0; i < result.getUrls().size(); i++) {
+                               final URL url = result.getUrls().get(i);
+                               if (url != null) {
+                                       result.getUrls().set(i, 
UriComponentsBuilder.fromHttpUrl(url.toString())
+                                                       
.replaceQueryParam(HTTPRequest.FAKE_IP)
+                                                       
.replaceQueryParam(RouterFilter.REDIRECT_QUERY_PARAM)
+                                                       
.build().toUri().toURL());
+                               }
+                       }
                }
        }
 
diff --git 
a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouterTest.java
 
b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouterTest.java
index 990b2a4..b5488fb 100644
--- 
a/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouterTest.java
+++ 
b/traffic_router/core/src/test/java/org/apache/traffic_control/traffic_router/core/router/TrafficRouterTest.java
@@ -36,6 +36,8 @@ import org.junit.Test;
 import org.xbill.DNS.Name;
 import org.xbill.DNS.Type;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -98,6 +100,7 @@ public class TrafficRouterTest {
         when(trafficRouter.singleRoute(any(HTTPRequest.class), 
any(Track.class))).thenCallRealMethod();
         
when(trafficRouter.selectDeliveryService(any(Request.class))).thenReturn(deliveryService);
         
when(trafficRouter.consistentHashDeliveryService(any(DeliveryService.class), 
any(HTTPRequest.class), any())).thenCallRealMethod();
+        
doCallRealMethod().when(trafficRouter).stripSpecialQueryParams(any(HTTPRouteResult.class));
     }
 
     @Test
@@ -324,4 +327,16 @@ public class TrafficRouterTest {
 
         assertThat(deliveryService.createURIString(httpRequest, cache), 
equalTo(dest.toString()));
     }
+
+    @Test
+    public void itStripsSpecialQueryParameters() throws MalformedURLException {
+        HTTPRouteResult result = new HTTPRouteResult(false);
+        result.setUrl(new 
URL("http://example.org/foo?trred=false&fakeClientIpAddress=192.168.0.2";));
+        trafficRouter.stripSpecialQueryParams(result);
+        assertThat(result.getUrl().toString(), 
equalTo("http://example.org/foo";));
+
+        result.setUrl(new 
URL("http://example.org/foo?b=1&trred=false&a=2&asdf=foo&fakeClientIpAddress=192.168.0.2&c=3";));
+        trafficRouter.stripSpecialQueryParams(result);
+        assertThat(result.getUrl().toString(), 
equalTo("http://example.org/foo?b=1&a=2&asdf=foo&c=3";));
+    }
 }

Reply via email to