func (h *JQHandler) handleJqSharePost(c *gin.Context) { if size, err := h.checkReqSize(c); err != nil { h.logger(c).WithField("size", size).WithError(err).Info("req too large") c.String(http.StatusExpectationFailed, err.Error()) return } c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, JSONPayloadLimit) var jq *jq.JQ if err := c.BindJSON(&jq); err != nil { err = fmt.Errorf("error parsing JSON: %s", err) h.logger(c).WithError(err).Info("error parsing JSON") c.String(http.StatusUnprocessableEntity, err.Error()) return } if err := jq.Validate(); err != nil { c.String(http.StatusUnprocessableEntity, err.Error()) return } id, err := h.DB.UpsertSnippet(FromJQ(jq)) if err != nil { h.logger(c).WithError(err).Info("error upserting snippet") c.String(http.StatusUnprocessableEntity, "error sharing snippet") return } c.String(http.StatusCreated, id) }
func (h *JQHandler) handleJq(rw http.ResponseWriter, r *http.Request) { if r.Method != "POST" { h.r.JSON(rw, 500, nil) return } b, err := ioutil.ReadAll(r.Body) if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } defer r.Body.Close() var jq *jq.JQ err = json.Unmarshal(b, &jq) if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } if err := jq.Validate(); err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } log.Println(jq) re, err := jq.Eval() if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } h.r.JSON(rw, 200, map[string]string{"result": re}) }
func (h *JQHandler) handleJqPost(rw http.ResponseWriter, r *http.Request) { if r.ContentLength == -1 { log.Printf("Error: Content length is unknown") } if r.ContentLength > JSONPayloadLimit { msg := fmt.Sprintf("JSON payload size is %.1fMB, larger than limit %dMB.", float64(r.ContentLength)/OneMB, JSONPayloadLimitMB) log.Printf("Error: %s", msg) h.r.JSON(rw, 403, map[string]string{ "message": msg, }) return } b, err := ioutil.ReadAll(r.Body) if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } defer r.Body.Close() var jq *jq.JQ err = json.Unmarshal(b, &jq) if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } re, err := jq.Eval() if err != nil { h.r.JSON(rw, 422, map[string]string{"message": err.Error()}) return } h.r.JSON(rw, 200, map[string]string{"result": re}) }
func (h *JQHandler) handleJqPost(c *gin.Context) { if size, err := h.checkReqSize(c); err != nil { h.logger(c).WithField("size", size).WithError(err).Info("req too large") c.String(http.StatusExpectationFailed, err.Error()) return } c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, JSONPayloadLimit) var j *jq.JQ if err := c.BindJSON(&j); err != nil { err = fmt.Errorf("error parsing JSON: %s", err) h.logger(c).WithError(err).Info("error parsing JSON") c.String(http.StatusUnprocessableEntity, err.Error()) return } ctx, cancel := context.WithTimeout(c.Request.Context(), JQExecTimeout) defer cancel() // Evaling into ResponseWriter sets the status code to 200 // appending error message in the end if there's any var debug bytes.Buffer w := io.MultiWriter(c.Writer, &debug) if err := j.Eval(ctx, w); err != nil { fmt.Fprint(c.Writer, err.Error()) if shouldLogJQError(err) { h.logger(c).WithError(err).WithFields(log.Fields{ "j": j.J, "q": j.Q, "o": j.Opts(), "r": debug.String(), }).Info("jq error") } } }