github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+incompatible/gateway/res_handler_header_injector.go (about) 1 package gateway 2 3 import ( 4 "net/http" 5 6 "github.com/mitchellh/mapstructure" 7 8 "github.com/TykTechnologies/tyk/apidef" 9 "github.com/TykTechnologies/tyk/user" 10 ) 11 12 type HeaderInjectorOptions struct { 13 AddHeaders map[string]string `mapstructure:"add_headers" bson:"add_headers" json:"add_headers"` 14 RemoveHeaders []string `mapstructure:"remove_headers" bson:"remove_headers" json:"remove_headers"` 15 } 16 17 type HeaderInjector struct { 18 Spec *APISpec 19 config HeaderInjectorOptions 20 } 21 22 func (HeaderInjector) Name() string { 23 return "HeaderInjector" 24 } 25 func (h *HeaderInjector) Init(c interface{}, spec *APISpec) error { 26 h.Spec = spec 27 return mapstructure.Decode(c, &h.config) 28 } 29 30 func (h *HeaderInjector) HandleResponse(rw http.ResponseWriter, res *http.Response, req *http.Request, ses *user.SessionState) error { 31 // TODO: This should only target specific paths 32 33 _, versionPaths, _, _ := h.Spec.Version(req) 34 found, meta := h.Spec.CheckSpecMatchesStatus(req, versionPaths, HeaderInjectedResponse) 35 if found { 36 hmeta := meta.(*apidef.HeaderInjectionMeta) 37 for _, dKey := range hmeta.DeleteHeaders { 38 res.Header.Del(dKey) 39 } 40 for nKey, nVal := range hmeta.AddHeaders { 41 res.Header.Set(nKey, replaceTykVariables(req, nVal, false)) 42 } 43 } 44 45 // Global header options 46 for _, n := range h.config.RemoveHeaders { 47 res.Header.Del(n) 48 } 49 for h, v := range h.config.AddHeaders { 50 res.Header.Set(h, replaceTykVariables(req, v, false)) 51 } 52 53 return nil 54 }