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  }