// serveWrite receives incoming series data and writes it to the database. func (h *Handler) serveWrite(w http.ResponseWriter, r *http.Request, user *influxdb.User) { var br batchWrite dec := json.NewDecoder(r.Body) var writeError = func(result influxdb.Result, statusCode int) { w.WriteHeader(statusCode) w.Header().Add("content-type", "application/json") _ = json.NewEncoder(w).Encode(&result) return } for { if err := dec.Decode(&br); err != nil { if err.Error() == "EOF" { w.WriteHeader(http.StatusOK) return } writeError(influxdb.Result{Err: err}, http.StatusInternalServerError) return } if br.Database == "" { writeError(influxdb.Result{Err: fmt.Errorf("database is required")}, http.StatusInternalServerError) return } if !h.server.DatabaseExists(br.Database) { writeError(influxdb.Result{Err: fmt.Errorf("database not found: %q", br.Database)}, http.StatusNotFound) return } if h.requireAuthentication && !user.Authorize(influxql.WritePrivilege, br.Database) { writeError(influxdb.Result{Err: fmt.Errorf("%q user is not authorized to write to database %q", user.Name, br.Database)}, http.StatusUnauthorized) return } for _, p := range br.Points { if p.Timestamp.IsZero() { p.Timestamp = br.Timestamp } if len(br.Tags) > 0 { for k, _ := range br.Tags { if p.Tags[k] == "" { p.Tags[k] = br.Tags[k] } } } if _, err := h.server.WriteSeries(br.Database, br.RetentionPolicy, []influxdb.Point{p}); err != nil { writeError(influxdb.Result{Err: err}, http.StatusInternalServerError) return } } } }
// serveWrite receives incoming series data and writes it to the database. func (h *Handler) serveWrite(w http.ResponseWriter, r *http.Request, user *influxdb.User) { var bp client.BatchPoints var dec *json.Decoder if h.WriteTrace { b, err := ioutil.ReadAll(r.Body) if err != nil { h.Logger.Print("write handler failed to read bytes from request body") } else { h.Logger.Printf("write body received by handler: %s", string(b)) } dec = json.NewDecoder(strings.NewReader(string(b))) } else { dec = json.NewDecoder(r.Body) defer r.Body.Close() } var writeError = func(result influxdb.Result, statusCode int) { w.WriteHeader(statusCode) w.Header().Add("content-type", "application/json") _ = json.NewEncoder(w).Encode(&result) return } if err := dec.Decode(&bp); err != nil { if err.Error() == "EOF" { w.WriteHeader(http.StatusOK) return } writeError(influxdb.Result{Err: err}, http.StatusInternalServerError) return } if bp.Database == "" { writeError(influxdb.Result{Err: fmt.Errorf("database is required")}, http.StatusInternalServerError) return } if !h.server.DatabaseExists(bp.Database) { writeError(influxdb.Result{Err: fmt.Errorf("database not found: %q", bp.Database)}, http.StatusNotFound) return } if h.requireAuthentication && user == nil { writeError(influxdb.Result{Err: fmt.Errorf("user is required to write to database %q", bp.Database)}, http.StatusUnauthorized) return } if h.requireAuthentication && !user.Authorize(influxql.WritePrivilege, bp.Database) { writeError(influxdb.Result{Err: fmt.Errorf("%q user is not authorized to write to database %q", user.Name, bp.Database)}, http.StatusUnauthorized) return } points, err := influxdb.NormalizeBatchPoints(bp) if err != nil { writeError(influxdb.Result{Err: err}, http.StatusInternalServerError) return } if index, err := h.server.WriteSeries(bp.Database, bp.RetentionPolicy, points); err != nil { writeError(influxdb.Result{Err: err}, http.StatusInternalServerError) return } else { w.Header().Add("X-InfluxDB-Index", fmt.Sprintf("%d", index)) } }