github.com/craicoverflow/tyk@v2.9.6-rc3+incompatible/gateway/mw_modify_headers.go (about)

     1  package gateway
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/TykTechnologies/tyk/apidef"
     7  )
     8  
     9  // TransformMiddleware is a middleware that will apply a template to a request body to transform it's contents ready for an upstream API
    10  type TransformHeaders struct {
    11  	BaseMiddleware
    12  }
    13  
    14  func (t *TransformHeaders) Name() string {
    15  	return "TransformHeaders"
    16  }
    17  
    18  func (t *TransformHeaders) EnabledForSpec() bool {
    19  	for _, version := range t.Spec.VersionData.Versions {
    20  		if len(version.ExtendedPaths.TransformHeader) > 0 ||
    21  			len(version.GlobalHeaders) > 0 ||
    22  			len(version.GlobalHeadersRemove) > 0 {
    23  			return true
    24  		}
    25  	}
    26  	return false
    27  }
    28  
    29  // ProcessRequest will run any checks on the request on the way through the system, return an error to have the chain fail
    30  func (t *TransformHeaders) ProcessRequest(w http.ResponseWriter, r *http.Request, _ interface{}) (error, int) {
    31  	vInfo, versionPaths, _, _ := t.Spec.Version(r)
    32  
    33  	// Manage global headers first - remove
    34  	for _, gdKey := range vInfo.GlobalHeadersRemove {
    35  		t.Logger().Debug("Removing: ", gdKey)
    36  		r.Header.Del(gdKey)
    37  	}
    38  
    39  	// Add
    40  	for nKey, nVal := range vInfo.GlobalHeaders {
    41  		t.Logger().Debug("Adding: ", nKey)
    42  		r.Header.Set(nKey, replaceTykVariables(r, nVal, false))
    43  	}
    44  
    45  	found, meta := t.Spec.CheckSpecMatchesStatus(r, versionPaths, HeaderInjected)
    46  	if found {
    47  		hmeta := meta.(*apidef.HeaderInjectionMeta)
    48  		for _, dKey := range hmeta.DeleteHeaders {
    49  			r.Header.Del(dKey)
    50  		}
    51  		for nKey, nVal := range hmeta.AddHeaders {
    52  			r.Header.Set(nKey, replaceTykVariables(r, nVal, false))
    53  		}
    54  	}
    55  
    56  	return nil, http.StatusOK
    57  }