rpc: always close http bodies (#8712)

Closes #8686
This commit is contained in:
Sam Kleinman
2022-06-07 12:40:22 -04:00
committed by GitHub
parent 3bb68b49f5
commit 931c98f7ad
3 changed files with 10 additions and 4 deletions

View File

@@ -81,9 +81,15 @@ func makeJSONRPCHandler(funcMap map[string]*RPCFunc, logger log.Logger) http.Han
}
}
func ensureBodyClose(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
next(w, r)
}
}
func handleInvalidJSONRPCPaths(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Since the pattern "/" matches all paths not matched by other registered patterns,
// we check whether the path is indeed "/", otherwise return a 404 error
if r.URL.Path != "/" {
http.NotFound(w, r)

View File

@@ -223,7 +223,7 @@ func TestRPCNotificationInBatch(t *testing.T) {
func TestUnknownRPCPath(t *testing.T) {
mux := testMux()
req, _ := http.NewRequest("GET", "http://localhost/unknownrpcpath", nil)
req, _ := http.NewRequest("GET", "http://localhost/unknownrpcpath", strings.NewReader(""))
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, req)
res := rec.Result()

View File

@@ -26,11 +26,11 @@ func RegisterRPCFuncs(mux *http.ServeMux, funcMap map[string]*RPCFunc, logger lo
if fn.ws {
continue // skip websocket endpoints, not usable via GET calls
}
mux.HandleFunc("/"+name, makeHTTPHandler(fn, logger))
mux.HandleFunc("/"+name, ensureBodyClose(makeHTTPHandler(fn, logger)))
}
// Endpoints for POST.
mux.HandleFunc("/", handleInvalidJSONRPCPaths(makeJSONRPCHandler(funcMap, logger)))
mux.HandleFunc("/", ensureBodyClose(handleInvalidJSONRPCPaths(makeJSONRPCHandler(funcMap, logger))))
}
// Function introspection