From b95d9a9b7b5fcd1dca4a33bca28a20248d80e4d1 Mon Sep 17 00:00:00 2001 From: Marcelo Ochoa Date: Wed, 13 Jan 2021 16:38:33 -0300 Subject: [PATCH 1/5] Added PreRequestRewriteListener functionality --- roundrobin/rr.go | 24 +++++++++++++++++++----- roundrobin/rr_test.go | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/roundrobin/rr.go b/roundrobin/rr.go index 631a97af..431641f6 100644 --- a/roundrobin/rr.go +++ b/roundrobin/rr.go @@ -46,17 +46,26 @@ func RoundRobinRequestRewriteListener(rrl RequestRewriteListener) LBOption { } } +// RoundRobinRequestRewriteListener is a functional argument that sets error handler of the server +func RoundRobinPreRequestRewriteListener(rrl RequestRewriteListener) LBOption { + return func(s *RoundRobin) error { + s.requestPreRewriteListener = rrl + return nil + } +} + // RoundRobin implements dynamic weighted round robin load balancer http handler type RoundRobin struct { mutex *sync.Mutex next http.Handler errHandler utils.ErrorHandler // Current index (starts from -1) - index int - servers []*server - currentWeight int - stickySession *StickySession - requestRewriteListener RequestRewriteListener + index int + servers []*server + currentWeight int + stickySession *StickySession + requestPreRewriteListener RequestRewriteListener + requestRewriteListener RequestRewriteListener log *log.Logger } @@ -107,6 +116,11 @@ func (r *RoundRobin) ServeHTTP(w http.ResponseWriter, req *http.Request) { // make shallow copy of request before chaning anything to avoid side effects newReq := *req + // Emit event to a listener if one exists + if r.requestPreRewriteListener != nil { + r.requestPreRewriteListener(req, &newReq) + } + stuck := false if r.stickySession != nil { cookieURL, present, err := r.stickySession.GetBackend(&newReq, r.Servers()) diff --git a/roundrobin/rr_test.go b/roundrobin/rr_test.go index 2f2841ca..c2df0a88 100644 --- a/roundrobin/rr_test.go +++ b/roundrobin/rr_test.go @@ -228,6 +228,23 @@ func TestRequestRewriteListener(t *testing.T) { assert.NotNil(t, lb.requestRewriteListener) } +func TestPreRequestRewriteListener(t *testing.T) { + a := testutils.NewResponder("a") + defer a.Close() + + b := testutils.NewResponder("b") + defer b.Close() + + fwd, err := forward.New() + require.NoError(t, err) + + lb, err := New(fwd, + RoundRobinPreRequestRewriteListener(func(oldReq *http.Request, newReq *http.Request) {})) + require.NoError(t, err) + + assert.NotNil(t, lb.requestPreRewriteListener) +} + func seq(t *testing.T, url string, repeat int) []string { var out []string for i := 0; i < repeat; i++ { From b5cd8068b5114a3880bd39311645efc54d141f78 Mon Sep 17 00:00:00 2001 From: Marcelo Ochoa Date: Wed, 13 Jan 2021 16:55:59 -0300 Subject: [PATCH 2/5] minor fix on comment --- roundrobin/rr.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roundrobin/rr.go b/roundrobin/rr.go index 431641f6..ded4a8d9 100644 --- a/roundrobin/rr.go +++ b/roundrobin/rr.go @@ -46,7 +46,7 @@ func RoundRobinRequestRewriteListener(rrl RequestRewriteListener) LBOption { } } -// RoundRobinRequestRewriteListener is a functional argument that sets error handler of the server +// RoundRobinPreRequestRewriteListener is a functional argument that sets error handler of the server func RoundRobinPreRequestRewriteListener(rrl RequestRewriteListener) LBOption { return func(s *RoundRobin) error { s.requestPreRewriteListener = rrl From c826da98475c290986ec45ecf8bea4ad03eb6675 Mon Sep 17 00:00:00 2001 From: Marcelo Ochoa Date: Wed, 13 Jan 2021 17:37:44 -0300 Subject: [PATCH 3/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 601e5bec..e17a2b30 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/vulcand/oxy +module github.com/marcelo-ochoa/oxy go 1.13 From 7bae99708223909b1501c917b402ab782cce8ddd Mon Sep 17 00:00:00 2001 From: Marcelo Ochoa Date: Thu, 14 Jan 2021 14:27:19 -0300 Subject: [PATCH 4/5] force set cookie even if was present force set cookie even if was present on request --- roundrobin/rr.go | 1 + 1 file changed, 1 insertion(+) diff --git a/roundrobin/rr.go b/roundrobin/rr.go index ded4a8d9..fe9e0295 100644 --- a/roundrobin/rr.go +++ b/roundrobin/rr.go @@ -130,6 +130,7 @@ func (r *RoundRobin) ServeHTTP(w http.ResponseWriter, req *http.Request) { } if present { + r.stickySession.StickBackend(cookieURL, &w) newReq.URL = cookieURL stuck = true } From 1b4ed4499028919180f67b4fa1f47d875e57d782 Mon Sep 17 00:00:00 2001 From: Marcelo Ochoa Date: Thu, 14 Jan 2021 14:32:38 -0300 Subject: [PATCH 5/5] Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e17a2b30..601e5bec 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/marcelo-ochoa/oxy +module github.com/vulcand/oxy go 1.13