Output proper HTTP status codes for Txn requests that are too large (#7157)
This commit is contained in:
parent
daff8f82dc
commit
3044b4bf89
|
@ -69,9 +69,11 @@ func (s *HTTPServer) convertOps(resp http.ResponseWriter, req *http.Request) (st
|
||||||
sizeStr := req.Header.Get("Content-Length")
|
sizeStr := req.Header.Get("Content-Length")
|
||||||
if sizeStr != "" {
|
if sizeStr != "" {
|
||||||
if size, err := strconv.Atoi(sizeStr); err != nil {
|
if size, err := strconv.Atoi(sizeStr); err != nil {
|
||||||
|
resp.WriteHeader(http.StatusBadRequest)
|
||||||
fmt.Fprintf(resp, "Failed to parse Content-Length: %v", err)
|
fmt.Fprintf(resp, "Failed to parse Content-Length: %v", err)
|
||||||
return nil, 0, false
|
return nil, 0, false
|
||||||
} else if size > int(s.agent.config.KVMaxValueSize) {
|
} else if size > int(s.agent.config.KVMaxValueSize) {
|
||||||
|
resp.WriteHeader(http.StatusRequestEntityTooLarge)
|
||||||
fmt.Fprintf(resp, "Request body too large, max size: %v bytes", s.agent.config.KVMaxValueSize)
|
fmt.Fprintf(resp, "Request body too large, max size: %v bytes", s.agent.config.KVMaxValueSize)
|
||||||
return nil, 0, false
|
return nil, 0, false
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ func TestTxnEndpoint_Bad_JSON(t *testing.T) {
|
||||||
|
|
||||||
func TestTxnEndpoint_Bad_Size_Item(t *testing.T) {
|
func TestTxnEndpoint_Bad_Size_Item(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
testIt := func(agent *TestAgent, wantPass bool) {
|
testIt := func(t *testing.T, agent *TestAgent, wantPass bool) {
|
||||||
value := strings.Repeat("X", 3*raft.SuggestedMaxDataSize)
|
value := strings.Repeat("X", 3*raft.SuggestedMaxDataSize)
|
||||||
value = base64.StdEncoding.EncodeToString([]byte(value))
|
value = base64.StdEncoding.EncodeToString([]byte(value))
|
||||||
buf := bytes.NewBuffer([]byte(fmt.Sprintf(`
|
buf := bytes.NewBuffer([]byte(fmt.Sprintf(`
|
||||||
|
@ -54,6 +54,7 @@ func TestTxnEndpoint_Bad_Size_Item(t *testing.T) {
|
||||||
]
|
]
|
||||||
`, value)))
|
`, value)))
|
||||||
req, _ := http.NewRequest("PUT", "/v1/txn", buf)
|
req, _ := http.NewRequest("PUT", "/v1/txn", buf)
|
||||||
|
req.Header.Add("Content-Length", fmt.Sprintf("%d", buf.Len()))
|
||||||
resp := httptest.NewRecorder()
|
resp := httptest.NewRecorder()
|
||||||
if _, err := agent.srv.Txn(resp, req); err != nil {
|
if _, err := agent.srv.Txn(resp, req); err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
|
@ -68,13 +69,13 @@ func TestTxnEndpoint_Bad_Size_Item(t *testing.T) {
|
||||||
|
|
||||||
t.Run("toobig", func(t *testing.T) {
|
t.Run("toobig", func(t *testing.T) {
|
||||||
a := NewTestAgent(t, t.Name(), "")
|
a := NewTestAgent(t, t.Name(), "")
|
||||||
testIt(a, false)
|
testIt(t, a, false)
|
||||||
a.Shutdown()
|
a.Shutdown()
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("allowed", func(t *testing.T) {
|
t.Run("allowed", func(t *testing.T) {
|
||||||
a := NewTestAgent(t, t.Name(), "limits = { kv_max_value_size = 123456789 }")
|
a := NewTestAgent(t, t.Name(), "limits = { kv_max_value_size = 123456789 }")
|
||||||
testIt(a, true)
|
testIt(t, a, true)
|
||||||
a.Shutdown()
|
a.Shutdown()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue