Commit f56d2090 authored by Tw's avatar Tw

proxy: make http header block scoped

Each proxy block should could specify its own http header
instead of sharing a global one.

Fix issue #341
Signed-off-by: default avatarTw <tw19881113@gmail.com>
parent 37e3cf68
...@@ -98,11 +98,6 @@ func TestWebSocketReverseProxyFromWSClient(t *testing.T) { ...@@ -98,11 +98,6 @@ func TestWebSocketReverseProxyFromWSClient(t *testing.T) {
// also sets up the rules/environment for testing WebSocket // also sets up the rules/environment for testing WebSocket
// proxy. // proxy.
func newWebSocketTestProxy(backendAddr string) *Proxy { func newWebSocketTestProxy(backendAddr string) *Proxy {
proxyHeaders = http.Header{
"Connection": {"{>Connection}"},
"Upgrade": {"{>Upgrade}"},
}
return &Proxy{ return &Proxy{
Upstreams: []Upstream{&fakeUpstream{name: backendAddr}}, Upstreams: []Upstream{&fakeUpstream{name: backendAddr}},
} }
...@@ -121,7 +116,9 @@ func (u *fakeUpstream) Select() *UpstreamHost { ...@@ -121,7 +116,9 @@ func (u *fakeUpstream) Select() *UpstreamHost {
return &UpstreamHost{ return &UpstreamHost{
Name: u.name, Name: u.name,
ReverseProxy: NewSingleHostReverseProxy(uri, ""), ReverseProxy: NewSingleHostReverseProxy(uri, ""),
ExtraHeaders: proxyHeaders, ExtraHeaders: http.Header{
"Connection": {"{>Connection}"},
"Upgrade": {"{>Upgrade}"}},
} }
} }
......
...@@ -16,13 +16,13 @@ import ( ...@@ -16,13 +16,13 @@ import (
var ( var (
supportedPolicies = make(map[string]func() Policy) supportedPolicies = make(map[string]func() Policy)
proxyHeaders = make(http.Header)
) )
type staticUpstream struct { type staticUpstream struct {
from string from string
Hosts HostPool proxyHeaders http.Header
Policy Policy Hosts HostPool
Policy Policy
FailTimeout time.Duration FailTimeout time.Duration
MaxFails int32 MaxFails int32
...@@ -72,7 +72,7 @@ func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) { ...@@ -72,7 +72,7 @@ func NewStaticUpstreams(c parse.Dispenser) ([]Upstream, error) {
Fails: 0, Fails: 0,
FailTimeout: upstream.FailTimeout, FailTimeout: upstream.FailTimeout,
Unhealthy: false, Unhealthy: false,
ExtraHeaders: proxyHeaders, ExtraHeaders: upstream.proxyHeaders,
CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc { CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc {
return func(uh *UpstreamHost) bool { return func(uh *UpstreamHost) bool {
if uh.Unhealthy { if uh.Unhealthy {
...@@ -159,10 +159,16 @@ func parseBlock(c *parse.Dispenser, u *staticUpstream) error { ...@@ -159,10 +159,16 @@ func parseBlock(c *parse.Dispenser, u *staticUpstream) error {
if !c.Args(&header, &value) { if !c.Args(&header, &value) {
return c.ArgErr() return c.ArgErr()
} }
proxyHeaders.Add(header, value) if u.proxyHeaders == nil {
u.proxyHeaders = make(http.Header)
}
u.proxyHeaders.Add(header, value)
case "websocket": case "websocket":
proxyHeaders.Add("Connection", "{>Connection}") if u.proxyHeaders == nil {
proxyHeaders.Add("Upgrade", "{>Upgrade}") u.proxyHeaders = make(http.Header)
}
u.proxyHeaders.Add("Connection", "{>Connection}")
u.proxyHeaders.Add("Upgrade", "{>Upgrade}")
case "without": case "without":
if !c.NextArg() { if !c.NextArg() {
return c.ArgErr() return c.ArgErr()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment