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 }