This commit is contained in:
Mohamad Tahir 2023-11-21 19:14:16 +03:00
commit 64049b4b18
Signed by: MohamadTahir
GPG Key ID: 116FAB02D35512FA
6 changed files with 90 additions and 0 deletions

12
.traefik.yml Normal file
View File

@ -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

1
README.md Normal file
View File

@ -0,0 +1 @@
# Traefik Response header forward plugin

16
docker-compose.yaml Normal file
View File

@ -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

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module github.com/ditkrg/traefik-response-header-forward-plugin
go 1.21.3

0
go.sum Normal file
View File

58
main.go Normal file
View File

@ -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)
}
}