Create Header Middleware
This commit is contained in:
parent
aea7bc0c07
commit
f275e4ad3c
12 changed files with 592 additions and 3 deletions
79
middlewares/headers.go
Normal file
79
middlewares/headers.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
package middlewares
|
||||
|
||||
//Middleware based on https://github.com/unrolled/secure
|
||||
|
||||
import (
|
||||
"github.com/containous/traefik/types"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// HeaderOptions is a struct for specifying configuration options for the headers middleware.
|
||||
type HeaderOptions struct {
|
||||
// If Custom request headers are set, these will be added to the request
|
||||
CustomRequestHeaders map[string]string
|
||||
// If Custom response headers are set, these will be added to the ResponseWriter
|
||||
CustomResponseHeaders map[string]string
|
||||
}
|
||||
|
||||
// HeaderStruct is a middleware that helps setup a few basic security features. A single headerOptions struct can be
|
||||
// provided to configure which features should be enabled, and the ability to override a few of the default values.
|
||||
type HeaderStruct struct {
|
||||
// Customize headers with a headerOptions struct.
|
||||
opt HeaderOptions
|
||||
}
|
||||
|
||||
// NewHeaderFromStruct constructs a new header instance from supplied frontend header struct.
|
||||
func NewHeaderFromStruct(headers types.Headers) *HeaderStruct {
|
||||
o := HeaderOptions{
|
||||
CustomRequestHeaders: headers.CustomRequestHeaders,
|
||||
CustomResponseHeaders: headers.CustomResponseHeaders,
|
||||
}
|
||||
|
||||
return &HeaderStruct{
|
||||
opt: o,
|
||||
}
|
||||
}
|
||||
|
||||
// NewHeader constructs a new header instance with supplied options.
|
||||
func NewHeader(options ...HeaderOptions) *HeaderStruct {
|
||||
var o HeaderOptions
|
||||
if len(options) == 0 {
|
||||
o = HeaderOptions{}
|
||||
} else {
|
||||
o = options[0]
|
||||
}
|
||||
|
||||
return &HeaderStruct{
|
||||
opt: o,
|
||||
}
|
||||
}
|
||||
|
||||
// Handler implements the http.HandlerFunc for integration with the standard net/http lib.
|
||||
func (s *HeaderStruct) Handler(h http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// Let headers process the request.
|
||||
s.Process(w, r)
|
||||
h.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *HeaderStruct) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
|
||||
s.Process(w, r)
|
||||
// If there is a next, call it.
|
||||
if next != nil {
|
||||
next(w, r)
|
||||
}
|
||||
}
|
||||
|
||||
// Process runs the actual checks and returns an error if the middleware chain should stop.
|
||||
func (s *HeaderStruct) Process(w http.ResponseWriter, r *http.Request) {
|
||||
// Loop through Custom request headers
|
||||
for header, value := range s.opt.CustomRequestHeaders {
|
||||
r.Header.Set(header, value)
|
||||
}
|
||||
|
||||
// Loop through Custom response headers
|
||||
for header, value := range s.opt.CustomResponseHeaders {
|
||||
w.Header().Add(header, value)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue