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

rawlin pushed a commit to branch 4.1.x
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/4.1.x by this push:
     new b1ebd76  Add Raw Remap Range Directive (#4757) (#4779)
b1ebd76 is described below

commit b1ebd76f3683c2c6ff5ba1fd1da046bb1a7d1b7a
Author: Rawlin Peters <[email protected]>
AuthorDate: Wed Jun 10 16:15:03 2020 -0600

    Add Raw Remap Range Directive (#4757) (#4779)
    
    Adds a __RANGE_DIRECTIVE__ to the Raw Remap processing, to insert the
    Delivery Service Range Request Handling directives there, instead of
    before the Raw Remap.
    
    Normally, Raw Remap always needs to be at the end of the remap line,
    but in some cases, specifically when custom remaps are modifying
    the Range header, it's necessary to put the Range Request directives
    (@plugin=slice.so, @plugin=caceh_raange_requests.so, etc) after
    the custom Raw Remap text.
    
    This makes that possible.
    
    (cherry picked from commit fc7a6b928d7e54186dd21b2f807991c07bbe008c)
    
    Co-authored-by: Robert O Butts <[email protected]>
---
 CHANGELOG.md                               |   1 +
 docs/source/overview/delivery_services.rst |   7 +
 lib/go-atscfg/remapdotconfig.go            |  16 +-
 lib/go-atscfg/remapdotconfig_test.go       | 228 +++++++++++++++++++++++++++++
 4 files changed, 249 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d10c750..4a83d82 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -65,6 +65,7 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
 - Fixed #4541: traffic_ops_server.js searches based on which= and can find 
data for multiple servers
 - Fixed POST deliveryservices/request (designed to simple send an email) 
regression which erroneously required deep caching type and routing name. 
[Related github issue](https://github.com/apache/trafficcontrol/issues/4735)
 - Fixed `maxRevalDurationDays` validation for `POST 
/api/1.x/user/current/jobs` and added that validation to the `/api/x/jobs` 
endpoints
+- Added Delivery Service Raw Remap `__RANGE_DIRECTIVE__` directive to allow 
inserting the Range Directive after the Raw Remap text. This allows Raw Remaps 
which manipulate the Range.
 
 ### Deprecated/Removed
 - The Traffic Ops `db/admin.pl` script has now been removed. Please use the 
`db/admin` binary instead.
diff --git a/docs/source/overview/delivery_services.rst 
b/docs/source/overview/delivery_services.rst
index 7d5d217..353b2ea 100644
--- a/docs/source/overview/delivery_services.rst
+++ b/docs/source/overview/delivery_services.rst
@@ -643,6 +643,13 @@ For HTTP and DNS-:ref:`Routed <ds-types>` Delivery 
Services, this will be added
        | remapText | In Traffic Ops source code and :ref:`to-api` 
requests/responses | unchanged (``text``, ``string`` etc.) |
        
+-----------+-----------------------------------------------------------------+---------------------------------------+
 
+Directives
+"""
+
+The Raw Remap text is ordinarily added at the end of the line, after 
everything else. However, it may be necessary to add Range Request Handling 
after the Raw Remap. For example, if you have a plugin which manipulates the 
Range header. In this case, you can insert the text ``__RANGE_DIRECTIVE__`` in 
the Raw Remap text, and the range request handling directives will be added at 
that point.
+
+For example, if you have an Apache Traffic Server lua plugin which manipulates 
the range, and are using Slice Range Request Handling which needs to run after 
your plugin, you can set a Raw Remap, ``@plugin=tslua.so @pparam=range.lua 
__RANGE_DIRECTIVE__``, and the ``@plugin=slice.so`` range directive will be 
inserted after your plugin.
+
 .. _ds-regex-remap:
 
 Regex Remap Expression
diff --git a/lib/go-atscfg/remapdotconfig.go b/lib/go-atscfg/remapdotconfig.go
index 7b91686..ad9c1bf 100644
--- a/lib/go-atscfg/remapdotconfig.go
+++ b/lib/go-atscfg/remapdotconfig.go
@@ -206,6 +206,8 @@ func GetServerConfigRemapDotConfigForEdge(
        return text
 }
 
+const RemapConfigRangeDirective = `__RANGE_DIRECTIVE__`
+
 // BuildRemapLine builds the remap line for the given server and delivery 
service.
 // The cacheKeyConfigParams map may be nil, if this ds profile had no cache 
key config params.
 func BuildRemapLine(cacheURLConfigParams map[string]string, atsMajorVersion 
int, server *ServerInfo, pData map[string]string, text string, ds 
RemapConfigDSData, mapFrom string, mapTo string, cacheKeyConfigParams 
map[string]string) string {
@@ -284,15 +286,23 @@ func BuildRemapLine(cacheURLConfigParams 
map[string]string, atsMajorVersion int,
        if ds.RegexRemap != nil && *ds.RegexRemap != "" {
                text += ` @plugin=regex_remap.so @pparam=regex_remap_` + 
ds.Name + ".config"
        }
+
+       rangeReqTxt := ""
        if ds.RangeRequestHandling != nil {
                if *ds.RangeRequestHandling == 
tc.RangeRequestHandlingBackgroundFetch {
-                       text += ` @plugin=background_fetch.so 
@pparam=bg_fetch.config`
+                       rangeReqTxt = ` @plugin=background_fetch.so 
@pparam=bg_fetch.config`
                } else if *ds.RangeRequestHandling == 
tc.RangeRequestHandlingCacheRangeRequest {
-                       text += ` @plugin=cache_range_requests.so `
+                       rangeReqTxt = ` @plugin=cache_range_requests.so `
                } else if *ds.RangeRequestHandling == 
tc.RangeRequestHandlingSlice && ds.RangeSliceBlockSize != nil {
-                       text += ` @plugin=slice.so @pparam=--blockbytes=` + 
strconv.Itoa(*ds.RangeSliceBlockSize) + ` @plugin=cache_range_requests.so   `
+                       rangeReqTxt = ` @plugin=slice.so @pparam=--blockbytes=` 
+ strconv.Itoa(*ds.RangeSliceBlockSize) + ` @plugin=cache_range_requests.so     
`
                }
        }
+       if ds.RemapText != nil && *ds.RemapText != "" && 
strings.Contains(*ds.RemapText, RemapConfigRangeDirective) {
+               *ds.RemapText = strings.Replace(*ds.RemapText, 
`__RANGE_DIRECTIVE__`, rangeReqTxt, 1)
+       } else {
+               text += rangeReqTxt
+       }
+
        if ds.RemapText != nil && *ds.RemapText != "" {
                text += " " + *ds.RemapText
        }
diff --git a/lib/go-atscfg/remapdotconfig_test.go 
b/lib/go-atscfg/remapdotconfig_test.go
index 52f9b2e..2030b43 100644
--- a/lib/go-atscfg/remapdotconfig_test.go
+++ b/lib/go-atscfg/remapdotconfig_test.go
@@ -4872,6 +4872,234 @@ func TestMakeRemapDotConfigEdgeRangeRequestSlice(t 
*testing.T) {
                t.Errorf("expected remap on edge server with ds slice range 
request handling to contain block size for the slice plugin, actual '%v'", txt)
        }
 }
+
+func TestMakeRemapDotConfigRawRemapRangeDirective(t *testing.T) {
+       serverName := tc.CacheName("server0")
+       toToolName := "to0"
+       toURL := "trafficops.example.net"
+       atsMajorVersion := 7
+
+       cacheURLConfigParams := map[string]string{
+               "location": "notinconfig",
+       }
+
+       dsProfilesCacheKeyConfigParams := map[int]map[string]string{
+               49: map[string]string{
+                       "cachekeykey": "cachekeyval",
+               },
+               44: map[string]string{
+                       "shouldnotincludeotherprofile": 
"shouldnotincludeotherprofileval",
+               },
+       }
+
+       serverPackageParamData := map[string]string{
+               "dscp_remap_no": "notused",
+       }
+
+       serverInfo := &ServerInfo{
+               CacheGroupID:                  42,
+               CDN:                           "mycdn",
+               CDNID:                         43,
+               DomainName:                    "mydomain",
+               HostName:                      "myhost",
+               HTTPSPort:                     12443,
+               ID:                            44,
+               IP:                            "192.168.2.4",
+               ParentCacheGroupID:            45,
+               ParentCacheGroupType:          "CGType4",
+               ProfileID:                     46,
+               ProfileName:                   "MyProfile",
+               Port:                          12080,
+               SecondaryParentCacheGroupID:   47,
+               SecondaryParentCacheGroupType: "MySecondaryParentCG",
+               Type:                          "EDGE",
+       }
+
+       remapDSData := []RemapConfigDSData{
+               RemapConfigDSData{
+                       ID:                       48,
+                       Type:                     "HTTP_LIVE_NATNL",
+                       OriginFQDN:               util.StrPtr("myorigin"),
+                       MidHeaderRewrite:         util.StrPtr("mymidrewrite"),
+                       CacheURL:                 util.StrPtr(""),
+                       RangeRequestHandling:     
util.IntPtr(tc.RangeRequestHandlingSlice),
+                       CacheKeyConfigParams:     
map[string]string{"cachekeyparamname": "cachekeyparamval"},
+                       RemapText:                util.StrPtr("@plugin=tslua.so 
@pparam=my-range-manipulator.lua __RANGE_DIRECTIVE__"),
+                       EdgeHeaderRewrite:        nil,
+                       SigningAlgorithm:         util.StrPtr("foo"),
+                       Name:                     "mydsname",
+                       QStringIgnore:            
util.IntPtr(int(tc.QueryStringIgnoreIgnoreInCacheKeyAndPassUp)),
+                       RegexRemap:               util.StrPtr(""),
+                       FQPacingRate:             util.IntPtr(0),
+                       DSCP:                     0,
+                       RoutingName:              util.StrPtr("myroutingname"),
+                       MultiSiteOrigin:          util.StrPtr("mymso"),
+                       Pattern:                  util.StrPtr(`mypattern`),
+                       RegexType:                
util.StrPtr(string(tc.DSMatchTypeHostRegex)),
+                       Domain:                   util.StrPtr("mydomain"),
+                       RegexSetNumber:           util.StrPtr("myregexsetnum"),
+                       OriginShield:             util.StrPtr("myoriginshield"),
+                       ProfileID:                util.IntPtr(49),
+                       Protocol:                 
util.IntPtr(int(tc.DSProtocolHTTPToHTTPS)),
+                       AnonymousBlockingEnabled: util.BoolPtr(false),
+                       Active:                   true,
+                       RangeSliceBlockSize:      util.IntPtr(262144),
+               },
+       }
+
+       txt := MakeRemapDotConfig(serverName, toToolName, toURL, 
atsMajorVersion, cacheURLConfigParams, dsProfilesCacheKeyConfigParams, 
serverPackageParamData, serverInfo, remapDSData)
+
+       txt = strings.TrimSpace(txt)
+
+       testComment(t, txt, string(serverName), toToolName, toURL)
+
+       txtLines := strings.Split(txt, "\n")
+
+       if len(txtLines) != 2 {
+               t.Fatalf("expected 1 remaps from HTTP_TO_HTTPS DS, actual: '%v' 
count %v", txt, len(txtLines))
+       }
+
+       remapLine := txtLines[1]
+
+       if !strings.HasPrefix(remapLine, "map") {
+               t.Errorf("expected to start with 'map', actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "slice.so") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain background fetch plugin, actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "cache_range_requests.so") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain cache_range_requests plugin, actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "pparam=--blockbytes=262144") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain block size for the slice plugin, actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "@plugin=tslua.so 
@pparam=my-range-manipulator.lua  @plugin=slice.so @pparam=--blockbytes=262144 
@plugin=cache_range_requests.so") {
+               t.Errorf("expected raw remap to come after range directive, 
actual '%v'", txt)
+       }
+       if strings.Contains(remapLine, "__RANGE_DIRECTIVE__") {
+               t.Errorf("expected raw remap range directive to be replaced, 
actual '%v'", txt)
+       }
+       if strings.Count(remapLine, "slice.so") != 1 {
+               t.Errorf("expected raw remap range directive to be replaced not 
duplicated, actual '%v'", txt)
+       }
+}
+
+func TestMakeRemapDotConfigRawRemapWithoutRangeDirective(t *testing.T) {
+       serverName := tc.CacheName("server0")
+       toToolName := "to0"
+       toURL := "trafficops.example.net"
+       atsMajorVersion := 7
+
+       cacheURLConfigParams := map[string]string{
+               "location": "notinconfig",
+       }
+
+       dsProfilesCacheKeyConfigParams := map[int]map[string]string{
+               49: map[string]string{
+                       "cachekeykey": "cachekeyval",
+               },
+               44: map[string]string{
+                       "shouldnotincludeotherprofile": 
"shouldnotincludeotherprofileval",
+               },
+       }
+
+       serverPackageParamData := map[string]string{
+               "dscp_remap_no": "notused",
+       }
+
+       serverInfo := &ServerInfo{
+               CacheGroupID:                  42,
+               CDN:                           "mycdn",
+               CDNID:                         43,
+               DomainName:                    "mydomain",
+               HostName:                      "myhost",
+               HTTPSPort:                     12443,
+               ID:                            44,
+               IP:                            "192.168.2.4",
+               ParentCacheGroupID:            45,
+               ParentCacheGroupType:          "CGType4",
+               ProfileID:                     46,
+               ProfileName:                   "MyProfile",
+               Port:                          12080,
+               SecondaryParentCacheGroupID:   47,
+               SecondaryParentCacheGroupType: "MySecondaryParentCG",
+               Type:                          "EDGE",
+       }
+
+       remapDSData := []RemapConfigDSData{
+               RemapConfigDSData{
+                       ID:                       48,
+                       Type:                     "HTTP_LIVE_NATNL",
+                       OriginFQDN:               util.StrPtr("myorigin"),
+                       MidHeaderRewrite:         util.StrPtr("mymidrewrite"),
+                       CacheURL:                 util.StrPtr(""),
+                       RangeRequestHandling:     
util.IntPtr(tc.RangeRequestHandlingSlice),
+                       CacheKeyConfigParams:     
map[string]string{"cachekeyparamname": "cachekeyparamval"},
+                       RemapText:                util.StrPtr("@plugin=tslua.so 
@pparam=my-range-manipulator.lua"),
+                       EdgeHeaderRewrite:        nil,
+                       SigningAlgorithm:         util.StrPtr("foo"),
+                       Name:                     "mydsname",
+                       QStringIgnore:            
util.IntPtr(int(tc.QueryStringIgnoreIgnoreInCacheKeyAndPassUp)),
+                       RegexRemap:               util.StrPtr(""),
+                       FQPacingRate:             util.IntPtr(0),
+                       DSCP:                     0,
+                       RoutingName:              util.StrPtr("myroutingname"),
+                       MultiSiteOrigin:          util.StrPtr("mymso"),
+                       Pattern:                  util.StrPtr(`mypattern`),
+                       RegexType:                
util.StrPtr(string(tc.DSMatchTypeHostRegex)),
+                       Domain:                   util.StrPtr("mydomain"),
+                       RegexSetNumber:           util.StrPtr("myregexsetnum"),
+                       OriginShield:             util.StrPtr("myoriginshield"),
+                       ProfileID:                util.IntPtr(49),
+                       Protocol:                 
util.IntPtr(int(tc.DSProtocolHTTPToHTTPS)),
+                       AnonymousBlockingEnabled: util.BoolPtr(false),
+                       Active:                   true,
+                       RangeSliceBlockSize:      util.IntPtr(262144),
+               },
+       }
+
+       txt := MakeRemapDotConfig(serverName, toToolName, toURL, 
atsMajorVersion, cacheURLConfigParams, dsProfilesCacheKeyConfigParams, 
serverPackageParamData, serverInfo, remapDSData)
+
+       txt = strings.TrimSpace(txt)
+
+       testComment(t, txt, string(serverName), toToolName, toURL)
+
+       txtLines := strings.Split(txt, "\n")
+
+       if len(txtLines) != 2 {
+               t.Fatalf("expected 1 remaps from HTTP_TO_HTTPS DS, actual: '%v' 
count %v", txt, len(txtLines))
+       }
+
+       remapLine := txtLines[1]
+
+       if !strings.HasPrefix(remapLine, "map") {
+               t.Errorf("expected to start with 'map', actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "slice.so") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain background fetch plugin, actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "cache_range_requests.so") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain cache_range_requests plugin, actual '%v'", txt)
+       }
+
+       if !strings.Contains(remapLine, "pparam=--blockbytes=262144") {
+               t.Errorf("expected remap on edge server with ds slice range 
request handling to contain block size for the slice plugin, actual '%v'", txt)
+       }
+
+       if !strings.HasSuffix(remapLine, "@plugin=tslua.so 
@pparam=my-range-manipulator.lua") {
+               t.Errorf("expected raw remap without range directive at end of 
remap line, actual '%v'", txt)
+       }
+       if strings.Count(remapLine, "slice.so") != 1 {
+               t.Errorf("expected raw remap range directive to not be 
duplicated, actual '%v'", txt)
+       }
+}
+
 func TestMakeRemapDotConfigEdgeRangeRequestCache(t *testing.T) {
        serverName := tc.CacheName("server0")
        toToolName := "to0"

Reply via email to