github.com/Tyktechnologies/tyk@v2.9.5+incompatible/gateway/res_handler_jq_transform.go (about)

     1  //+build jq
     2  
     3  package gateway
     4  
     5  import (
     6  	"bytes"
     7  	"encoding/json"
     8  	"io/ioutil"
     9  	"net/http"
    10  	"strconv"
    11  
    12  	"github.com/TykTechnologies/tyk/user"
    13  )
    14  
    15  type ResponseTransformJQMiddleware struct {
    16  	Spec *APISpec
    17  }
    18  
    19  func (h *ResponseTransformJQMiddleware) Init(c interface{}, spec *APISpec) error {
    20  	h.Spec = spec
    21  
    22  	return nil
    23  }
    24  
    25  func (h *ResponseTransformJQMiddleware) HandleResponse(rw http.ResponseWriter, res *http.Response, req *http.Request, ses *user.SessionState) error {
    26  	_, versionPaths, _, _ := h.Spec.Version(req)
    27  	found, meta := h.Spec.CheckSpecMatchesStatus(req, versionPaths, TransformedJQResponse)
    28  	if !found {
    29  		return nil
    30  	}
    31  
    32  	defer res.Body.Close()
    33  
    34  	ts := meta.(*TransformJQSpec)
    35  
    36  	var bodyObj interface{}
    37  	dec := json.NewDecoder(res.Body)
    38  	if err := dec.Decode(&bodyObj); err != nil {
    39  		return err
    40  	}
    41  	jqObj := map[string]interface{}{
    42  		"body":                  bodyObj,
    43  		"_tyk_context":          ctxGetData(req),
    44  		"_tyk_response_headers": res.Header,
    45  	}
    46  
    47  	jqResult, err := lockedJQTransform(h.Spec, ts, jqObj)
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	transformed, _ := json.Marshal(jqResult.Body)
    53  
    54  	bodyBuffer := bytes.NewBuffer(transformed)
    55  	res.Header.Set("Content-Length", strconv.Itoa(bodyBuffer.Len()))
    56  	res.ContentLength = int64(bodyBuffer.Len())
    57  	res.Body = ioutil.NopCloser(bodyBuffer)
    58  
    59  	// Replace header in the response
    60  	for hName, hValue := range jqResult.RewriteHeaders {
    61  		res.Header.Set(hName, hValue)
    62  	}
    63  
    64  	return nil
    65  }