REST: Add 'max-body-bytes' Flag (#6167)
* Add max-body-bytes flag for REST service * Add changelog entries * Change types
This commit is contained in:
parent
b3cada1001
commit
fe9fe87693
|
@ -99,6 +99,7 @@ information on how to implement the new `Keyring` interface.
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
|
* (rest) [\#6167](https://github.com/cosmos/cosmos-sdk/pull/6167) Support `max-body-bytes` CLI flag for the REST service.
|
||||||
* (x/ibc) [\#5588](https://github.com/cosmos/cosmos-sdk/pull/5588) Add [ICS 024 - Host State Machine Requirements](https://github.com/cosmos/ics/tree/master/spec/ics-024-host-requirements) subpackage to `x/ibc` module.
|
* (x/ibc) [\#5588](https://github.com/cosmos/cosmos-sdk/pull/5588) Add [ICS 024 - Host State Machine Requirements](https://github.com/cosmos/ics/tree/master/spec/ics-024-host-requirements) subpackage to `x/ibc` module.
|
||||||
* (x/ibc) [\#5277](https://github.com/cosmos/cosmos-sdk/pull/5277) `x/ibc` changes from IBC alpha. For more details check the the [`x/ibc/spec`](https://github.com/cosmos/tree/master/x/ibc/spec) directory:
|
* (x/ibc) [\#5277](https://github.com/cosmos/cosmos-sdk/pull/5277) `x/ibc` changes from IBC alpha. For more details check the the [`x/ibc/spec`](https://github.com/cosmos/tree/master/x/ibc/spec) directory:
|
||||||
* [ICS 002 - Client Semantics](https://github.com/cosmos/ics/tree/master/spec/ics-002-client-semantics) subpackage
|
* [ICS 002 - Client Semantics](https://github.com/cosmos/ics/tree/master/spec/ics-002-client-semantics) subpackage
|
||||||
|
|
|
@ -63,6 +63,7 @@ const (
|
||||||
FlagMaxOpenConnections = "max-open"
|
FlagMaxOpenConnections = "max-open"
|
||||||
FlagRPCReadTimeout = "read-timeout"
|
FlagRPCReadTimeout = "read-timeout"
|
||||||
FlagRPCWriteTimeout = "write-timeout"
|
FlagRPCWriteTimeout = "write-timeout"
|
||||||
|
FlagRPCMaxBodyBytes = "max-body-bytes"
|
||||||
FlagOutputDocument = "output-document" // inspired by wget -O
|
FlagOutputDocument = "output-document" // inspired by wget -O
|
||||||
FlagSkipConfirmation = "yes"
|
FlagSkipConfirmation = "yes"
|
||||||
FlagProve = "prove"
|
FlagProve = "prove"
|
||||||
|
@ -148,6 +149,7 @@ func RegisterRestServerFlags(cmd *cobra.Command) *cobra.Command {
|
||||||
cmd.Flags().Uint(FlagMaxOpenConnections, 1000, "The number of maximum open connections")
|
cmd.Flags().Uint(FlagMaxOpenConnections, 1000, "The number of maximum open connections")
|
||||||
cmd.Flags().Uint(FlagRPCReadTimeout, 10, "The RPC read timeout (in seconds)")
|
cmd.Flags().Uint(FlagRPCReadTimeout, 10, "The RPC read timeout (in seconds)")
|
||||||
cmd.Flags().Uint(FlagRPCWriteTimeout, 10, "The RPC write timeout (in seconds)")
|
cmd.Flags().Uint(FlagRPCWriteTimeout, 10, "The RPC write timeout (in seconds)")
|
||||||
|
cmd.Flags().Uint(FlagRPCMaxBodyBytes, 1000000, "The RPC max body bytes (in MB)")
|
||||||
cmd.Flags().Bool(FlagUnsafeCORS, false, "Allows CORS requests from all domains. For development purposes only, use it at your own risk.")
|
cmd.Flags().Bool(FlagUnsafeCORS, false, "Allows CORS requests from all domains. For development purposes only, use it at your own risk.")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|
|
@ -46,28 +46,23 @@ func NewRestServer(cdc *codec.Codec) *RestServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start starts the rest server
|
// StartWithConfig starts the REST server that listens on the provided listenAddr.
|
||||||
func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout uint, cors bool) (err error) {
|
// It will use the provided RPC configuration.
|
||||||
|
func (rs *RestServer) StartWithConfig(listenAddr string, cors bool, cfg *rpcserver.Config) error {
|
||||||
server.TrapSignal(func() {
|
server.TrapSignal(func() {
|
||||||
err := rs.listener.Close()
|
err := rs.listener.Close()
|
||||||
rs.log.Error("error closing listener", "err", err)
|
rs.log.Error("error closing listener", "err", err)
|
||||||
})
|
})
|
||||||
|
|
||||||
cfg := rpcserver.DefaultConfig()
|
listener, err := rpcserver.Listen(listenAddr, cfg)
|
||||||
cfg.MaxOpenConnections = maxOpen
|
|
||||||
cfg.ReadTimeout = time.Duration(readTimeout) * time.Second
|
|
||||||
cfg.WriteTimeout = time.Duration(writeTimeout) * time.Second
|
|
||||||
|
|
||||||
rs.listener, err = rpcserver.Listen(listenAddr, cfg)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rs.listener = listener
|
||||||
|
|
||||||
rs.log.Info(
|
rs.log.Info(
|
||||||
fmt.Sprintf(
|
fmt.Sprintf("Starting application REST service (chain-id: %q)...", viper.GetString(flags.FlagChainID)),
|
||||||
"Starting application REST service (chain-id: %q)...",
|
|
||||||
viper.GetString(flags.FlagChainID),
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var h http.Handler = rs.Mux
|
var h http.Handler = rs.Mux
|
||||||
|
@ -79,6 +74,18 @@ func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTi
|
||||||
return rpcserver.StartHTTPServer(rs.listener, rs.Mux, rs.log, cfg)
|
return rpcserver.StartHTTPServer(rs.listener, rs.Mux, rs.log, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start starts the REST server that listens on the provided listenAddr. The REST
|
||||||
|
// service will use Tendermint's default RPC configuration, where the R/W timeout
|
||||||
|
// and max open connections are overridden.
|
||||||
|
func (rs *RestServer) Start(listenAddr string, maxOpen int, readTimeout, writeTimeout uint, cors bool) error {
|
||||||
|
cfg := rpcserver.DefaultConfig()
|
||||||
|
cfg.MaxOpenConnections = maxOpen
|
||||||
|
cfg.ReadTimeout = time.Duration(readTimeout) * time.Second
|
||||||
|
cfg.WriteTimeout = time.Duration(writeTimeout) * time.Second
|
||||||
|
|
||||||
|
return rs.StartWithConfig(listenAddr, cors, cfg)
|
||||||
|
}
|
||||||
|
|
||||||
// ServeCommand will start the application REST service as a blocking process. It
|
// ServeCommand will start the application REST service as a blocking process. It
|
||||||
// takes a codec to create a RestServer object and a function to register all
|
// takes a codec to create a RestServer object and a function to register all
|
||||||
// necessary routes.
|
// necessary routes.
|
||||||
|
@ -92,16 +99,18 @@ func ServeCommand(cdc *codec.Codec, registerRoutesFn func(*RestServer)) *cobra.C
|
||||||
registerRoutesFn(rs)
|
registerRoutesFn(rs)
|
||||||
rs.registerSwaggerUI()
|
rs.registerSwaggerUI()
|
||||||
|
|
||||||
// Start the rest server and return error if one exists
|
cfg := rpcserver.DefaultConfig()
|
||||||
err = rs.Start(
|
cfg.MaxOpenConnections = viper.GetInt(flags.FlagMaxOpenConnections)
|
||||||
viper.GetString(flags.FlagListenAddr),
|
cfg.ReadTimeout = time.Duration(viper.GetInt64(flags.FlagRPCReadTimeout)) * time.Second
|
||||||
viper.GetInt(flags.FlagMaxOpenConnections),
|
cfg.WriteTimeout = time.Duration(viper.GetInt64(flags.FlagRPCWriteTimeout)) * time.Second
|
||||||
uint(viper.GetInt(flags.FlagRPCReadTimeout)),
|
cfg.MaxBodyBytes = viper.GetInt64(flags.FlagRPCMaxBodyBytes)
|
||||||
uint(viper.GetInt(flags.FlagRPCWriteTimeout)),
|
|
||||||
viper.GetBool(flags.FlagUnsafeCORS),
|
|
||||||
)
|
|
||||||
|
|
||||||
return err
|
// start the rest server and return error if one exists
|
||||||
|
return rs.StartWithConfig(
|
||||||
|
viper.GetString(flags.FlagListenAddr),
|
||||||
|
viper.GetBool(flags.FlagUnsafeCORS),
|
||||||
|
cfg,
|
||||||
|
)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue