github.com/Tyktechnologies/tyk@v2.9.5+incompatible/gateway/multi_target_proxy_handler.go (about) 1 package gateway 2 3 import ( 4 "io" 5 "net/http" 6 "net/url" 7 8 "github.com/sirupsen/logrus" 9 ) 10 11 type MultiTargetProxy struct { 12 versionProxies map[string]*ReverseProxy 13 specReference *APISpec 14 defaultProxy *ReverseProxy 15 } 16 17 func (m *MultiTargetProxy) proxyForRequest(r *http.Request) *ReverseProxy { 18 version, _, _, _ := m.specReference.Version(r) 19 if proxy := m.versionProxies[version.Name]; proxy != nil { 20 return proxy 21 } 22 log.WithFields(logrus.Fields{ 23 "prefix": "multi-target", 24 }).Warning("No proxy found, using default") 25 return m.defaultProxy 26 } 27 28 func (m *MultiTargetProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) ProxyResponse { 29 log.WithFields(logrus.Fields{ 30 "prefix": "multi-target", 31 }).Debug("Serving Multi-target...") 32 return m.proxyForRequest(r).ServeHTTP(w, r) 33 } 34 35 func (m *MultiTargetProxy) ServeHTTPForCache(w http.ResponseWriter, r *http.Request) ProxyResponse { 36 return m.proxyForRequest(r).ServeHTTPForCache(w, r) 37 } 38 39 func (m *MultiTargetProxy) CopyResponse(dst io.Writer, src io.Reader) { 40 m.defaultProxy.CopyResponse(dst, src) 41 } 42 43 func NewMultiTargetProxy(spec *APISpec, logger *logrus.Entry) *MultiTargetProxy { 44 m := &MultiTargetProxy{} 45 m.versionProxies = make(map[string]*ReverseProxy) 46 m.specReference = spec 47 m.defaultProxy = TykNewSingleHostReverseProxy(spec.target, spec, logger) 48 49 for vname, vdata := range spec.VersionData.Versions { 50 if vdata.OverrideTarget == "" { 51 log.WithFields(logrus.Fields{ 52 "prefix": "multi-target", 53 }).Info("----> Version ", vname, " has no override target") 54 m.versionProxies[vname] = m.defaultProxy 55 continue 56 } 57 remote, err := url.Parse(vdata.OverrideTarget) 58 log.WithFields(logrus.Fields{ 59 "prefix": "multi-target", 60 }).Info("----> Version ", vname, " has '", vdata.OverrideTarget, "' for override target") 61 log.WithFields(logrus.Fields{ 62 "prefix": "multi-target", 63 }).Debug("Multi-target URL: ", vdata.OverrideTarget) 64 log.WithFields(logrus.Fields{ 65 "prefix": "multi-target", 66 }).Debug("Multi-target URL (obj): ", remote) 67 if err != nil { 68 log.WithFields(logrus.Fields{ 69 "prefix": "multi-target", 70 }).Error("Couldn't parse version target URL in MultiTarget: ", err) 71 } 72 m.versionProxies[vname] = TykNewSingleHostReverseProxy(remote, spec, logger) 73 } 74 return m 75 }