github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+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) *http.Response { 29 log.WithFields(logrus.Fields{ 30 "prefix": "multi-target", 31 }).Debug("Serving Multi-target...") 32 return m.proxyForRequest(r).ServeHTTP(w, r) 33 } 34 func (m *MultiTargetProxy) ServeHTTPForCache(w http.ResponseWriter, r *http.Request) *http.Response { 35 return m.proxyForRequest(r).ServeHTTPForCache(w, r) 36 } 37 38 func (m *MultiTargetProxy) CopyResponse(dst io.Writer, src io.Reader) { 39 m.defaultProxy.CopyResponse(dst, src) 40 } 41 42 func NewMultiTargetProxy(spec *APISpec) *MultiTargetProxy { 43 m := &MultiTargetProxy{} 44 m.versionProxies = make(map[string]*ReverseProxy) 45 m.specReference = spec 46 m.defaultProxy = TykNewSingleHostReverseProxy(spec.target, spec) 47 48 for vname, vdata := range spec.VersionData.Versions { 49 if vdata.OverrideTarget == "" { 50 log.WithFields(logrus.Fields{ 51 "prefix": "multi-target", 52 }).Info("----> Version ", vname, " has no override target") 53 m.versionProxies[vname] = m.defaultProxy 54 continue 55 } 56 remote, err := url.Parse(vdata.OverrideTarget) 57 log.WithFields(logrus.Fields{ 58 "prefix": "multi-target", 59 }).Info("----> Version ", vname, " has '", vdata.OverrideTarget, "' for override target") 60 log.WithFields(logrus.Fields{ 61 "prefix": "multi-target", 62 }).Debug("Multi-target URL: ", vdata.OverrideTarget) 63 log.WithFields(logrus.Fields{ 64 "prefix": "multi-target", 65 }).Debug("Multi-target URL (obj): ", remote) 66 if err != nil { 67 log.WithFields(logrus.Fields{ 68 "prefix": "multi-target", 69 }).Error("Couldn't parse version target URL in MultiTarget: ", err) 70 } 71 m.versionProxies[vname] = TykNewSingleHostReverseProxy(remote, spec) 72 } 73 return m 74 }