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  }