commit 64049b4b18f7383ccc5b77df065723129857b0d9 Author: MohamadTahir Date: Tue Nov 21 19:14:16 2023 +0300 init diff --git a/.traefik.yml b/.traefik.yml new file mode 100644 index 0000000..69c8dea --- /dev/null +++ b/.traefik.yml @@ -0,0 +1,12 @@ +displayName: UsersBlocker + +type: middleware + +import: github.com/ditkrg/traefik-response-header-forward-plugin + +summary: A middleware to add headers from request to response. + +testData: + requestHeaders: + - userId1 + - userId2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e2922a3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Traefik Response header forward plugin diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..8a3f62a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,16 @@ +version: '3' + +services: + reverse-proxy: + image: traefik:v3.0 + command: + - --api.insecure=true + - --providers.docker + - "--experimental.localPlugins.responseHeaderForward.moduleName=github.com/ditkrg/traefik-response-header-forward-plugin" + ports: + - "9090:80" + - "9091:8080" + volumes: + # So that Traefik can listen to the Docker events + - /var/run/docker.sock:/var/run/docker.sock + - ./:/plugins-local/src/github.com/ditkrg/traefik-response-header-forward-plugin diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7c8e87c --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/ditkrg/traefik-response-header-forward-plugin + +go 1.21.3 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/main.go b/main.go new file mode 100644 index 0000000..b8984c3 --- /dev/null +++ b/main.go @@ -0,0 +1,58 @@ +package traefik_response_header_forward_plugin + +import ( + "context" + "fmt" + "net/http" +) + +type RequestHeader struct { + Name string `json:"name,omitempty"` +} + +type Config struct { + RequestHeaders []RequestHeader `json:"requestHeaders,omitempty"` +} + +func CreateConfig() *Config { + return &Config{ + RequestHeaders: make([]RequestHeader, 0), + } +} + +type ResponseHeaderForward struct { + next http.Handler + name string + requestHeaders []RequestHeader +} + +func New(ctx context.Context, next http.Handler, config *Config, name string) (http.Handler, error) { + if len(config.RequestHeaders) == 0 { + return nil, fmt.Errorf("RequestHeaders cannot be empty") + + } + + for _, headerName := range config.RequestHeaders { + if headerName.Name == "" { + return nil, fmt.Errorf("RequestHeaders.Name cannot be empty") + } + } + return &ResponseHeaderForward{ + next: next, + name: name, + requestHeaders: config.RequestHeaders, + }, 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) + } +}