update spf13/cobra dependency to 1.0.0

This commit is contained in:
louisgong
2020-05-13 15:27:34 +08:00
parent e26af96b8e
commit 205ded20da
91 changed files with 8428 additions and 315 deletions

View File

@@ -2,6 +2,7 @@ package wsproxy
import (
"bufio"
"fmt"
"io"
"net/http"
"strings"
@@ -31,6 +32,7 @@ type Proxy struct {
methodOverrideParam string
tokenCookieName string
requestMutator RequestMutatorFunc
headerForwarder func(header string) bool
}
// Logger collects log messages.
@@ -71,6 +73,13 @@ func WithRequestMutator(fn RequestMutatorFunc) Option {
}
}
// WithForwardedHeaders allows controlling which headers are forwarded.
func WithForwardedHeaders(fn func(header string) bool) Option {
return func(p *Proxy) {
p.headerForwarder = fn
}
}
// WithLogger allows a custom FieldLogger to be supplied
func WithLogger(logger Logger) Option {
return func(p *Proxy) {
@@ -78,6 +87,17 @@ func WithLogger(logger Logger) Option {
}
}
var defaultHeadersToForward = map[string]bool{
"Origin": true,
"origin": true,
"Referer": true,
"referer": true,
}
func defaultHeaderForwarder(header string) bool {
return defaultHeadersToForward[header]
}
// WebsocketProxy attempts to expose the underlying handler as a bidi websocket stream with newline-delimited
// JSON as the content encoding.
//
@@ -96,6 +116,7 @@ func WebsocketProxy(h http.Handler, opts ...Option) http.Handler {
logger: logrus.New(),
methodOverrideParam: MethodOverrideParam,
tokenCookieName: TokenCookieName,
headerForwarder: defaultHeaderForwarder,
}
for _, o := range opts {
o(p)
@@ -144,7 +165,12 @@ func (p *Proxy) proxy(w http.ResponseWriter, r *http.Request) {
return
}
if swsp := r.Header.Get("Sec-WebSocket-Protocol"); swsp != "" {
request.Header.Set("Authorization", strings.Replace(swsp, "Bearer, ", "Bearer ", 1))
request.Header.Set("Authorization", transformSubProtocolHeader(swsp))
}
for header := range r.Header {
if p.headerForwarder(header) {
request.Header.Set(header, r.Header.Get(header))
}
}
// If token cookie is present, populate Authorization header from the cookie instead.
if cookie, err := r.Cookie(p.tokenCookieName); err == nil {
@@ -239,6 +265,17 @@ func newInMemoryResponseWriter(w io.Writer) *inMemoryResponseWriter {
}
}
// IE and Edge do not delimit Sec-WebSocket-Protocol strings with spaces
func transformSubProtocolHeader(header string) string {
tokens := strings.SplitN(header, "Bearer,", 2)
if len(tokens) < 2 {
return ""
}
return fmt.Sprintf("Bearer %v", strings.Trim(tokens[1], " "))
}
func (w *inMemoryResponseWriter) Write(b []byte) (int, error) {
return w.Writer.Write(b)
}