Skip to content

Commit 65874bb

Browse files
authored
Merge pull request #7 from Thijmen/feature/add-original-header
Add Header with original URL
2 parents f9f3412 + d7d4c53 commit 65874bb

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

traefikremovequeryparametersbyregex.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package traefik_remove_query_parameters_by_regex
55
import (
66
"context"
77
"errors"
8-
"log"
98
"net/http"
109
"regexp"
1110
)
@@ -18,9 +17,10 @@ const (
1817

1918
// Config is the configuration for this plugin.
2019
type Config struct {
21-
Type modificationType `json:"type"`
22-
AllowedValuesRegex string `json:"allowedValuesRegex"`
23-
ExceptURIRegex string `json:"exceptUriRegex"`
20+
Type modificationType `json:"type"`
21+
AllowedValuesRegex string `json:"allowedValuesRegex"`
22+
ExceptURIRegex string `json:"exceptUriRegex"`
23+
AddOriginalHostnameHeader bool `json:"addOriginalHostnameHeader"`
2424
}
2525

2626
// CreateConfig creates a new configuration for this plugin.
@@ -77,6 +77,8 @@ func New(ctx context.Context, next http.Handler, config *Config, name string) (h
7777
func (q *QueryParameterRemover) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
7878
qry := req.URL.Query()
7979

80+
originalQuery := req.URL.String()
81+
8082
switch q.config.Type {
8183
case deleteExceptType:
8284

@@ -92,13 +94,19 @@ func (q *QueryParameterRemover) ServeHTTP(rw http.ResponseWriter, req *http.Requ
9294

9395
regex := regexp.MustCompile(q.config.AllowedValuesRegex)
9496

97+
addOriginalHeader := false
98+
9599
for param := range req.URL.Query() {
96100
if !regex.MatchString(param) {
97101
qry.Del(param)
98102
req.URL.RawQuery = qry.Encode()
99-
log.Printf("Removed parameter: %s \n", param)
103+
addOriginalHeader = true
100104
}
101105
}
106+
107+
if q.config.AddOriginalHostnameHeader && addOriginalHeader {
108+
req.Header.Add("Plugin-Original-Uri", originalQuery)
109+
}
102110
}
103111

104112
req.URL.RawQuery = qry.Encode()

traefikremovequeryparametersbyregex_test.go

+29-1
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,21 @@ func TestDeleteQueryParamDoesNotWorkWithRegexWithADash(t *testing.T) {
6060
expected := "x-live-preview=1"
6161
previous := "test=1&x-live-preview=1"
6262

63-
6463
assertQueryModificationHelper(t, cfg, previous, expected, "")
6564
}
6665

66+
func TestItSendsTheHeader(t *testing.T) {
67+
cfg := traefik_remove_query_parameters_by_regex.CreateConfig()
68+
cfg.Type = "deleteexcept"
69+
cfg.AllowedValuesRegex = "(testing|x-live-preview)"
70+
cfg.ExceptURIRegex = "(qontrol)"
71+
cfg.AddOriginalHostnameHeader = true
72+
headerValue := "http://localhost?test=1&x-live-preview=1"
73+
previous := "test=1&x-live-preview=1"
74+
75+
assertHeaderValue(t, cfg, previous, headerValue)
76+
}
77+
6778
func TestErrorInvalidType(t *testing.T) {
6879
cfg := traefik_remove_query_parameters_by_regex.CreateConfig()
6980
cfg.Type = "bla"
@@ -117,3 +128,20 @@ func assertQueryModificationHelper(t *testing.T, cfg *traefik_remove_query_param
117128
t.Errorf("Expected %s, got %s", expected, req.URL.Query().Encode())
118129
}
119130
}
131+
132+
func assertHeaderValue(t *testing.T, cfg *traefik_remove_query_parameters_by_regex.Config, previous, expectedHeaderValue string) {
133+
t.Helper()
134+
handler, recorder, req, err := createReqAndRecorder(cfg)
135+
if err != nil {
136+
t.Fatal(err)
137+
return
138+
}
139+
req.URL.RawQuery = previous
140+
handler.ServeHTTP(recorder, req)
141+
142+
header := req.Header.Get("Plugin-Original-Uri")
143+
144+
if header != expectedHeaderValue {
145+
t.Errorf("Expected %s, got %s", expectedHeaderValue, header)
146+
}
147+
}

0 commit comments

Comments
 (0)