Mirror influxdb api for large payloads in influx_listener input

This commit is contained in:
greg linton
2019-07-30 14:02:23 -06:00
parent 5c7c9e40ee
commit 53910f4bf3
2 changed files with 10 additions and 4 deletions
@@ -281,6 +281,10 @@ func (h *HTTPListener) serveWrite(res http.ResponseWriter, req *http.Request) {
for {
n, err := io.ReadFull(body, buf[bufStart:])
if err != nil && err != io.ErrUnexpectedEOF && err != io.EOF {
if err.Error() == "http: request body too large" {
tooLarge(res)
return
}
log.Println("D! " + err.Error())
// problem reading the request body
badRequest(res, err.Error())
@@ -290,7 +294,7 @@ func (h *HTTPListener) serveWrite(res http.ResponseWriter, req *http.Request) {
if err == io.EOF {
if return400 {
badRequest(res, "")
tooLarge(res)
} else {
res.WriteHeader(http.StatusNoContent)
}
@@ -341,6 +345,7 @@ func (h *HTTPListener) serveWrite(res http.ResponseWriter, req *http.Request) {
// drop any line longer than the max buffer size
log.Printf("D! http_listener received a single line longer than the maximum of %d bytes",
len(buf))
// todo: why can't we just tooLarge(res) and return here?
hangingBytes = true
return400 = true
bufStart = 0
@@ -380,9 +385,10 @@ func (h *HTTPListener) parse(b []byte, t time.Time, precision string) error {
func tooLarge(res http.ResponseWriter) {
res.Header().Set("Content-Type", "application/json")
res.Header().Set("X-Influxdb-Version", "1.0")
res.Header().Set("X-Influxdb-Error", "http: request body too large")
res.Header().Set("X-Influxdb-Error", "Request Entity Too Large")
res.WriteHeader(http.StatusRequestEntityTooLarge)
res.Write([]byte(`{"error":"http: request body too large"}`))
res.Write([]byte(`{"error":"Request Entity Too Large"}
`))
}
func badRequest(res http.ResponseWriter, errString string) {
@@ -185,7 +185,7 @@ func TestWriteHTTP(t *testing.T) {
resp, err = http.Post(createURL(listener, "http", "/write", "db=mydb"), "", bytes.NewBuffer([]byte(hugeMetric)))
require.NoError(t, err)
resp.Body.Close()
require.EqualValues(t, 400, resp.StatusCode)
require.EqualValues(t, 413, resp.StatusCode)
acc.Wait(3)
acc.AssertContainsTaggedFields(t, "cpu_load_short",