confi: add MaxRequestHeaderBytes RPC configuration option

A part of #3131, follow the notion of https://github.com/neo-project/neo-modules/pull/827,
but don't restrict request line size due to https://github.com/golang/go/issues/15494.

Signed-off-by: Anna Shaleva <shaleva.ann@nspcc.ru>
This commit is contained in:
Anna Shaleva 2023-11-23 13:39:24 +03:00
parent 802d8d24b9
commit d511f6e5a9
4 changed files with 34 additions and 19 deletions

View file

@ -188,6 +188,7 @@ RPC:
MaxFindStoragePageSize: 50 MaxFindStoragePageSize: 50
MaxNEP11Tokens: 100 MaxNEP11Tokens: 100
MaxRequestBodyBytes: 5242880 MaxRequestBodyBytes: 5242880
MaxRequestHeaderBytes: 1048576
MaxWebSocketClients: 64 MaxWebSocketClients: 64
SessionEnabled: false SessionEnabled: false
SessionExpirationTime: 15 SessionExpirationTime: 15
@ -228,6 +229,8 @@ where:
`getnep11balances` call. `getnep11balances` call.
- `MaxRequestBodyBytes` - the maximum allowed HTTP request body size in bytes - `MaxRequestBodyBytes` - the maximum allowed HTTP request body size in bytes
(5MB by default). (5MB by default).
- `MaxRequestHeaderBytes` - the maximum allowed HTTP request header size in bytes
(1MB by default).
- `MaxWebSocketClients` - the maximum simultaneous websocket client connection - `MaxWebSocketClients` - the maximum simultaneous websocket client connection
number (64 by default). Attempts to establish additional connections will number (64 by default). Attempts to establish additional connections will
lead to websocket handshake failures. Use "-1" to disable websocket lead to websocket handshake failures. Use "-1" to disable websocket

View file

@ -3,6 +3,7 @@ package config
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"net/http"
"os" "os"
"time" "time"
@ -33,6 +34,9 @@ const (
// DefaultMaxRequestBodyBytes is the default maximum allowed size of HTTP // DefaultMaxRequestBodyBytes is the default maximum allowed size of HTTP
// request body in bytes. // request body in bytes.
DefaultMaxRequestBodyBytes = 5 * 1024 * 1024 DefaultMaxRequestBodyBytes = 5 * 1024 * 1024
// DefaultMaxRequestHeaderBytes is the maximum permitted size of the headers
// in an HTTP request.
DefaultMaxRequestHeaderBytes = http.DefaultMaxHeaderBytes
) )
// Version is the version of the node, set at the build time. // Version is the version of the node, set at the build time.

View file

@ -17,6 +17,7 @@ type (
MaxFindStorageResultItems int `yaml:"MaxFindStoragePageSize"` MaxFindStorageResultItems int `yaml:"MaxFindStoragePageSize"`
MaxNEP11Tokens int `yaml:"MaxNEP11Tokens"` MaxNEP11Tokens int `yaml:"MaxNEP11Tokens"`
MaxRequestBodyBytes int `yaml:"MaxRequestBodyBytes"` MaxRequestBodyBytes int `yaml:"MaxRequestBodyBytes"`
MaxRequestHeaderBytes int `yaml:"MaxRequestHeaderBytes"`
MaxWebSocketClients int `yaml:"MaxWebSocketClients"` MaxWebSocketClients int `yaml:"MaxWebSocketClients"`
SessionEnabled bool `yaml:"SessionEnabled"` SessionEnabled bool `yaml:"SessionEnabled"`
SessionExpirationTime int `yaml:"SessionExpirationTime"` SessionExpirationTime int `yaml:"SessionExpirationTime"`

View file

@ -267,25 +267,6 @@ var rpcWsHandlers = map[string]func(*Server, params.Params, *subscriber) (any, *
// untyped nil or non-nil structure implementing OracleHandler interface. // untyped nil or non-nil structure implementing OracleHandler interface.
func New(chain Ledger, conf config.RPC, coreServer *network.Server, func New(chain Ledger, conf config.RPC, coreServer *network.Server,
orc OracleHandler, log *zap.Logger, errChan chan<- error) Server { orc OracleHandler, log *zap.Logger, errChan chan<- error) Server {
addrs := conf.Addresses
httpServers := make([]*http.Server, len(addrs))
for i, addr := range addrs {
httpServers[i] = &http.Server{
Addr: addr,
}
}
var tlsServers []*http.Server
if cfg := conf.TLSConfig; cfg.Enabled {
addrs := cfg.Addresses
tlsServers = make([]*http.Server, len(addrs))
for i, addr := range addrs {
tlsServers[i] = &http.Server{
Addr: addr,
}
}
}
protoCfg := chain.GetConfig().ProtocolConfiguration protoCfg := chain.GetConfig().ProtocolConfiguration
if conf.SessionEnabled { if conf.SessionEnabled {
if conf.SessionExpirationTime <= 0 { if conf.SessionExpirationTime <= 0 {
@ -317,6 +298,10 @@ func New(chain Ledger, conf config.RPC, coreServer *network.Server,
conf.MaxRequestBodyBytes = config.DefaultMaxRequestBodyBytes conf.MaxRequestBodyBytes = config.DefaultMaxRequestBodyBytes
log.Info("MaxRequestBodyBytes is not set or wong, setting default value", zap.Int("MaxRequestBodyBytes", config.DefaultMaxRequestBodyBytes)) log.Info("MaxRequestBodyBytes is not set or wong, setting default value", zap.Int("MaxRequestBodyBytes", config.DefaultMaxRequestBodyBytes))
} }
if conf.MaxRequestHeaderBytes <= 0 {
conf.MaxRequestHeaderBytes = config.DefaultMaxRequestHeaderBytes
log.Info("MaxRequestHeaderBytes is not set or wong, setting default value", zap.Int("MaxRequestHeaderBytes", config.DefaultMaxRequestHeaderBytes))
}
if conf.MaxWebSocketClients == 0 { if conf.MaxWebSocketClients == 0 {
conf.MaxWebSocketClients = defaultMaxWebSocketClients conf.MaxWebSocketClients = defaultMaxWebSocketClients
log.Info("MaxWebSocketClients is not set or wrong, setting default value", zap.Int("MaxWebSocketClients", defaultMaxWebSocketClients)) log.Info("MaxWebSocketClients is not set or wrong, setting default value", zap.Int("MaxWebSocketClients", defaultMaxWebSocketClients))
@ -329,6 +314,28 @@ func New(chain Ledger, conf config.RPC, coreServer *network.Server,
if conf.EnableCORSWorkaround { if conf.EnableCORSWorkaround {
wsOriginChecker = func(_ *http.Request) bool { return true } wsOriginChecker = func(_ *http.Request) bool { return true }
} }
addrs := conf.Addresses
httpServers := make([]*http.Server, len(addrs))
for i, addr := range addrs {
httpServers[i] = &http.Server{
Addr: addr,
MaxHeaderBytes: conf.MaxRequestHeaderBytes,
}
}
var tlsServers []*http.Server
if cfg := conf.TLSConfig; cfg.Enabled {
addrs := cfg.Addresses
tlsServers = make([]*http.Server, len(addrs))
for i, addr := range addrs {
tlsServers[i] = &http.Server{
Addr: addr,
MaxHeaderBytes: conf.MaxRequestHeaderBytes,
}
}
}
return Server{ return Server{
http: httpServers, http: httpServers,
https: tlsServers, https: tlsServers,