github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+incompatible/gateway/res_handler_header_transform.go (about) 1 package gateway 2 3 import ( 4 "net/http" 5 "net/url" 6 "strings" 7 8 "github.com/mitchellh/mapstructure" 9 10 "github.com/TykTechnologies/tyk/user" 11 ) 12 13 type RevProxyTransform struct { 14 Headers []string // List of HTTP headers to be modified 15 Target_host string // Target host for reverse proxy 16 } 17 18 type HeaderTransformOptions struct { 19 RevProxyTransform RevProxyTransform `mapstructure:"rev_proxy_header_cleanup" bson:"rev_proxy_header_cleanup" json:"rev_proxy_header_cleanup"` 20 } 21 22 type HeaderTransform struct { 23 Spec *APISpec 24 config HeaderTransformOptions 25 } 26 27 func (HeaderTransform) Name() string { 28 return "HeaderTransform" 29 } 30 31 func (h *HeaderTransform) Init(c interface{}, spec *APISpec) error { 32 if err := mapstructure.Decode(c, &h.config); err != nil { 33 return err 34 } 35 h.Spec = spec 36 return nil 37 } 38 39 func (h *HeaderTransform) HandleResponse(rw http.ResponseWriter, 40 res *http.Response, req *http.Request, ses *user.SessionState) error { 41 42 // Parse target_host parameter from configuration 43 target_url, err := url.Parse(h.config.RevProxyTransform.Target_host) 44 if err != nil { 45 return err 46 } 47 48 for _, name := range h.config.RevProxyTransform.Headers { 49 // check if header is present and its value is not empty 50 val := res.Header.Get(name) 51 if val == "" { 52 continue 53 } 54 // Replace scheme 55 val = strings.Replace(val, h.Spec.target.Scheme, target_url.Scheme, -1) 56 // Replace host 57 val = strings.Replace(val, h.Spec.target.Host, target_url.Host, -1) 58 // Transform path 59 if h.Spec.Proxy.StripListenPath { 60 if len(h.Spec.target.Path) != 0 { 61 val = strings.Replace(val, h.Spec.target.Path, 62 h.Spec.Proxy.ListenPath, -1) 63 } else { 64 val = strings.Replace(val, req.URL.Path, 65 h.Spec.Proxy.ListenPath+req.URL.Path, -1) 66 } 67 } else { 68 if len(h.Spec.target.Path) != 0 { 69 val = strings.Replace(val, h.Spec.target.Path, "/", -1) 70 } 71 } 72 res.Header.Set(name, val) 73 } 74 return nil 75 }