first commit
This commit is contained in:
commit
3ca46c9ea2
19 changed files with 958 additions and 0 deletions
106
forwarding.go
Normal file
106
forwarding.go
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
package traefik_umami_feeder
|
||||
|
||||
// Copied source from
|
||||
// https://github.com/kzmake/traefik-plugin-forward-request/blob/master/util.go
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
xForwardedProto = "x-forwarded-proto"
|
||||
xForwardedFor = "x-forwarded-for"
|
||||
xForwardedHost = "x-forwarded-host"
|
||||
xForwardedPort = "x-forwarded-port"
|
||||
xForwardedURI = "x-forwarded-uri"
|
||||
xForwardedMethod = "x-forwarded-method"
|
||||
|
||||
connection = "connection"
|
||||
keepAlive = "keep-alive"
|
||||
proxyAuthenticate = "proxy-authenticate"
|
||||
proxyAuthorization = "proxy-authorization"
|
||||
te = "te" // canonicalized version of "TE"
|
||||
trailers = "trailers"
|
||||
transferEncoding = "transfer-Encoding"
|
||||
upgrade = "upgrade"
|
||||
)
|
||||
|
||||
var hopHeaders = []string{
|
||||
connection,
|
||||
keepAlive,
|
||||
proxyAuthenticate,
|
||||
proxyAuthorization,
|
||||
te, // canonicalized version of "TE"
|
||||
trailers,
|
||||
transferEncoding,
|
||||
upgrade,
|
||||
}
|
||||
|
||||
func copyHeaders(dst, src http.Header) {
|
||||
for k, vv := range src {
|
||||
for _, v := range vv {
|
||||
dst.Add(k, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func removeHeaders(headers http.Header, names ...string) {
|
||||
for _, h := range names {
|
||||
headers.Del(h)
|
||||
}
|
||||
}
|
||||
|
||||
func writeXForwardedHeaders(dst http.Header, req *http.Request) {
|
||||
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
|
||||
if values := req.Header.Values(xForwardedFor); len(values) > 0 {
|
||||
clientIP = strings.Join(values, ", ") + ", " + clientIP
|
||||
}
|
||||
dst.Set(xForwardedFor, clientIP)
|
||||
}
|
||||
|
||||
xfm := req.Header.Get(xForwardedMethod)
|
||||
switch {
|
||||
case xfm != "":
|
||||
dst.Set(xForwardedMethod, xfm)
|
||||
case req.Method != "":
|
||||
dst.Set(xForwardedMethod, req.Method)
|
||||
default:
|
||||
dst.Del(xForwardedMethod)
|
||||
}
|
||||
|
||||
xfp := req.Header.Get(xForwardedProto)
|
||||
switch {
|
||||
case xfp != "":
|
||||
dst.Set(xForwardedProto, xfp)
|
||||
case req.TLS != nil:
|
||||
dst.Set(xForwardedProto, "https")
|
||||
default:
|
||||
dst.Set(xForwardedProto, "http")
|
||||
}
|
||||
|
||||
if xfp := req.Header.Get(xForwardedPort); xfp != "" {
|
||||
dst.Set(xForwardedPort, xfp)
|
||||
}
|
||||
|
||||
xfh := req.Header.Get(xForwardedHost)
|
||||
switch {
|
||||
case xfh != "":
|
||||
dst.Set(xForwardedHost, xfh)
|
||||
case req.Host != "":
|
||||
dst.Set(xForwardedHost, req.Host)
|
||||
default:
|
||||
dst.Del(xForwardedHost)
|
||||
}
|
||||
|
||||
xfu := req.Header.Get(xForwardedURI)
|
||||
switch {
|
||||
case xfu != "":
|
||||
dst.Set(xForwardedURI, xfu)
|
||||
case req.URL.RequestURI() != "":
|
||||
dst.Set(xForwardedURI, req.URL.RequestURI())
|
||||
default:
|
||||
dst.Del(xForwardedURI)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue