mirror of
https://github.com/ditkrg/traefik-response-header-forward-plugin.git
synced 2026-01-22 21:46:38 +00:00
add hijacker
This commit is contained in:
parent
30e10ba8ec
commit
5b93b79349
76
main.go
76
main.go
@ -1,11 +1,56 @@
|
||||
package traefik_response_header_forward_plugin
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
var (
|
||||
_ interface {
|
||||
http.ResponseWriter
|
||||
http.Hijacker
|
||||
} = &wrappedResponseWriter{}
|
||||
)
|
||||
|
||||
type wrappedResponseWriter struct {
|
||||
rw http.ResponseWriter
|
||||
buf *bytes.Buffer
|
||||
code int
|
||||
}
|
||||
|
||||
func (w *wrappedResponseWriter) Header() http.Header {
|
||||
return w.rw.Header()
|
||||
}
|
||||
|
||||
func (w *wrappedResponseWriter) Write(b []byte) (int, error) {
|
||||
return w.buf.Write(b)
|
||||
}
|
||||
|
||||
func (w *wrappedResponseWriter) WriteHeader(code int) {
|
||||
w.code = code
|
||||
}
|
||||
|
||||
func (w *wrappedResponseWriter) Flush() {
|
||||
w.rw.WriteHeader(w.code)
|
||||
io.Copy(w.rw, w.buf)
|
||||
}
|
||||
|
||||
func (w *wrappedResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||
hijacker, ok := w.rw.(http.Hijacker)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("%T is not an http.Hijacker", w.rw)
|
||||
}
|
||||
|
||||
return hijacker.Hijack()
|
||||
}
|
||||
|
||||
// ========================================
|
||||
|
||||
type RequestHeader struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
}
|
||||
@ -23,7 +68,7 @@ func CreateConfig() *Config {
|
||||
type ResponseHeaderForward struct {
|
||||
next http.Handler
|
||||
name string
|
||||
requestHeaders []RequestHeader
|
||||
config *Config
|
||||
}
|
||||
|
||||
func New(ctx context.Context, next http.Handler, config *Config, name string) (http.Handler, error) {
|
||||
@ -40,19 +85,26 @@ func New(ctx context.Context, next http.Handler, config *Config, name string) (h
|
||||
return &ResponseHeaderForward{
|
||||
next: next,
|
||||
name: name,
|
||||
requestHeaders: config.RequestHeaders,
|
||||
config: config,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (a *ResponseHeaderForward) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
||||
a.next.ServeHTTP(rw, req)
|
||||
|
||||
// for _, requestHeader := range a.requestHeaders {
|
||||
// headerValue := req.Header.Get(requestHeader.Name)
|
||||
// if headerValue == "" {
|
||||
// continue
|
||||
// }
|
||||
|
||||
// rw.Header().Set(requestHeader.Name, headerValue)
|
||||
// }
|
||||
resp := &wrappedResponseWriter{
|
||||
rw: rw,
|
||||
buf: &bytes.Buffer{},
|
||||
}
|
||||
|
||||
defer resp.Flush()
|
||||
|
||||
a.next.ServeHTTP(resp, req)
|
||||
|
||||
for _, requestHeader := range a.config.RequestHeaders {
|
||||
headerValue := req.Header.Get(requestHeader.Name)
|
||||
if headerValue == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
resp.Header().Set(requestHeader.Name, headerValue)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user