github.com/dbernstein1/tyk@v2.9.0-beta9-dl-apic+incompatible/gateway/res_handler_header_injector.go (about)

     1  package gateway
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/mitchellh/mapstructure"
     7  
     8  	"github.com/TykTechnologies/tyk/apidef"
     9  	"github.com/TykTechnologies/tyk/user"
    10  )
    11  
    12  type HeaderInjectorOptions struct {
    13  	AddHeaders    map[string]string `mapstructure:"add_headers" bson:"add_headers" json:"add_headers"`
    14  	RemoveHeaders []string          `mapstructure:"remove_headers" bson:"remove_headers" json:"remove_headers"`
    15  }
    16  
    17  type HeaderInjector struct {
    18  	Spec   *APISpec
    19  	config HeaderInjectorOptions
    20  }
    21  
    22  func (HeaderInjector) Name() string {
    23  	return "HeaderInjector"
    24  }
    25  func (h *HeaderInjector) Init(c interface{}, spec *APISpec) error {
    26  	h.Spec = spec
    27  	return mapstructure.Decode(c, &h.config)
    28  }
    29  
    30  func (h *HeaderInjector) HandleResponse(rw http.ResponseWriter, res *http.Response, req *http.Request, ses *user.SessionState) error {
    31  	// TODO: This should only target specific paths
    32  
    33  	_, versionPaths, _, _ := h.Spec.Version(req)
    34  	found, meta := h.Spec.CheckSpecMatchesStatus(req, versionPaths, HeaderInjectedResponse)
    35  	if found {
    36  		hmeta := meta.(*apidef.HeaderInjectionMeta)
    37  		for _, dKey := range hmeta.DeleteHeaders {
    38  			res.Header.Del(dKey)
    39  		}
    40  		for nKey, nVal := range hmeta.AddHeaders {
    41  			res.Header.Set(nKey, replaceTykVariables(req, nVal, false))
    42  		}
    43  	}
    44  
    45  	// Global header options
    46  	for _, n := range h.config.RemoveHeaders {
    47  		res.Header.Del(n)
    48  	}
    49  	for h, v := range h.config.AddHeaders {
    50  		res.Header.Set(h, replaceTykVariables(req, v, false))
    51  	}
    52  
    53  	return nil
    54  }