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  }