mirror of
https://github.com/tendermint/tendermint.git
synced 2026-02-03 10:32:05 +00:00
* Set cache control in the HTTP-RPC response header * Add a simply cache policy to the RPC routes * add a condition to check the RPC request has default height settings * fix cherry pick error * update pending log * use options struct intead of single parameter * refacor FuncOptions to functional options * add functional options in WebSocket RPC function * revert doc * replace deprecated function call * revise functional options * remove unuse comment * fix revised error * adjust cache-control settings * Update rpc/jsonrpc/server/http_json_handler.go Co-authored-by: Thane Thomson <connect@thanethomson.com> * linter: Fix false positive Signed-off-by: Thane Thomson <connect@thanethomson.com> * rpc: Separate cacheable and non-cacheable HTTP response writers Allows us to roll this change out in a non-API-breaking way, since this is an additive change. Signed-off-by: Thane Thomson <connect@thanethomson.com> * rpc: Ensure consistent caching strategy Ensure a consistent caching strategy across both JSONRPC- and URI-based requests. This requires a bit of a refactor of the previous caching logic, which is complicated a little by the complex reflection-based approach taken in the Tendermint RPC. Signed-off-by: Thane Thomson <connect@thanethomson.com> * rpc: Add more tests for caching Signed-off-by: Thane Thomson <connect@thanethomson.com> * Update CHANGELOG_PENDING Signed-off-by: Thane Thomson <connect@thanethomson.com> * light: Sync routes config with RPC core Signed-off-by: Thane Thomson <connect@thanethomson.com> * rpc: Update OpenAPI docs Signed-off-by: Thane Thomson <connect@thanethomson.com> Signed-off-by: Thane Thomson <connect@thanethomson.com> Co-authored-by: jayt106 <jaytseng106@gmail.com> Co-authored-by: jay tseng <jay.tseng@crypto.com> Co-authored-by: JayT106 <JayT106@users.noreply.github.com>
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
//go:build gofuzz || go1.18
|
|
|
|
package tests
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/tendermint/tendermint/libs/log"
|
|
rpcserver "github.com/tendermint/tendermint/rpc/jsonrpc/server"
|
|
rpctypes "github.com/tendermint/tendermint/rpc/jsonrpc/types"
|
|
)
|
|
|
|
func FuzzRPCJSONRPCServer(f *testing.F) {
|
|
type args struct {
|
|
S string `json:"s"`
|
|
I int `json:"i"`
|
|
}
|
|
var rpcFuncMap = map[string]*rpcserver.RPCFunc{
|
|
"c": rpcserver.NewRPCFunc(func(ctx *rpctypes.Context, args *args, options ...rpcserver.Option) (string, error) {
|
|
return "foo", nil
|
|
}, "args"),
|
|
}
|
|
|
|
mux := http.NewServeMux()
|
|
rpcserver.RegisterRPCFuncs(mux, rpcFuncMap, log.NewNopLogger())
|
|
f.Fuzz(func(t *testing.T, data []byte) {
|
|
if len(data) == 0 {
|
|
return
|
|
}
|
|
|
|
req, err := http.NewRequest("POST", "http://localhost/", bytes.NewReader(data))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
rec := httptest.NewRecorder()
|
|
mux.ServeHTTP(rec, req)
|
|
res := rec.Result()
|
|
blob, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := res.Body.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
if len(blob) == 0 {
|
|
return
|
|
}
|
|
|
|
if outputJSONIsSlice(blob) {
|
|
var recv []rpctypes.RPCResponse
|
|
if err := json.Unmarshal(blob, &recv); err != nil {
|
|
panic(err)
|
|
}
|
|
return
|
|
}
|
|
var recv rpctypes.RPCResponse
|
|
if err := json.Unmarshal(blob, &recv); err != nil {
|
|
panic(err)
|
|
}
|
|
})
|
|
}
|
|
|
|
func outputJSONIsSlice(input []byte) bool {
|
|
var slice []json.RawMessage
|
|
return json.Unmarshal(input, &slice) == nil
|
|
}
|