102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"sync/atomic"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type ReadWriteHandler interface {
|
||
|
GetMaxMessageSize() int64
|
||
|
GetReadBufferSize() int
|
||
|
GetWriteBufferSize() int
|
||
|
GetReadTimeout() time.Duration
|
||
|
GetWriteTimeout() time.Duration
|
||
|
}
|
||
|
|
||
|
type ReadWriteHandlers struct {
|
||
|
MaxMessageSize int64 `json:"maxMessageSize,omitempty"`
|
||
|
// Per-connection buffer size for requests' reading.
|
||
|
// This also limits the maximum header size.
|
||
|
//
|
||
|
// Increase this buffer if your clients send multi-KB RequestURIs
|
||
|
// and/or multi-KB headers (for example, BIG cookies).
|
||
|
//
|
||
|
// Default buffer size is used if not set.
|
||
|
ReadBufferSize int `json:"readBufferSize,omitempty"`
|
||
|
// Per-connection buffer size for responses' writing.
|
||
|
//
|
||
|
// Default buffer size is used if not set.
|
||
|
WriteBufferSize int `json:"writeBufferSize,omitempty"`
|
||
|
// Maximum duration for reading the full request (including body).
|
||
|
//
|
||
|
// This also limits the maximum duration for idle keep-alive
|
||
|
// connections.
|
||
|
//
|
||
|
// By default request read timeout is unlimited.
|
||
|
ReadTimeout time.Duration `json:"readTimeout,omitempty"`
|
||
|
|
||
|
// Maximum duration for writing the full response (including body).
|
||
|
//
|
||
|
// By default response write timeout is unlimited.
|
||
|
WriteTimeout time.Duration `json:"writeTimeout,omitempty"`
|
||
|
|
||
|
validated atomic.Value
|
||
|
}
|
||
|
|
||
|
func (rwh *ReadWriteHandlers) GetMaxMessageSize() int64 {
|
||
|
return rwh.MaxMessageSize
|
||
|
}
|
||
|
func (rwh *ReadWriteHandlers) GetReadBufferSize() int {
|
||
|
return rwh.ReadBufferSize
|
||
|
}
|
||
|
func (rwh *ReadWriteHandlers) GetWriteBufferSize() int {
|
||
|
return rwh.WriteBufferSize
|
||
|
}
|
||
|
func (rwh *ReadWriteHandlers) GetReadTimeout() time.Duration {
|
||
|
return rwh.ReadTimeout
|
||
|
}
|
||
|
func (rwh *ReadWriteHandlers) GetWriteTimeout() time.Duration {
|
||
|
return rwh.WriteTimeout
|
||
|
}
|
||
|
|
||
|
func (rwh *ReadWriteHandlers) Clone() *ReadWriteHandlers {
|
||
|
return &ReadWriteHandlers{
|
||
|
MaxMessageSize: rwh.MaxMessageSize,
|
||
|
ReadBufferSize: rwh.ReadBufferSize,
|
||
|
WriteBufferSize: rwh.WriteBufferSize,
|
||
|
ReadTimeout: rwh.ReadTimeout,
|
||
|
WriteTimeout: rwh.WriteTimeout,
|
||
|
validated: rwh.validated,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (rwh *ReadWriteHandlers) Validate() error {
|
||
|
if nil != rwh.validated.Load() {
|
||
|
return nil
|
||
|
}
|
||
|
rwh.validated.Store(true)
|
||
|
|
||
|
if rwh.MaxMessageSize <= 0 {
|
||
|
rwh.MaxMessageSize = DefaultMaxMessageSize
|
||
|
}
|
||
|
if rwh.ReadBufferSize <= 0 {
|
||
|
rwh.ReadBufferSize = DefaultReadBufferSize
|
||
|
}
|
||
|
if rwh.WriteBufferSize <= 0 {
|
||
|
rwh.WriteBufferSize = DefaultWriteBufferSize
|
||
|
}
|
||
|
if rwh.ReadTimeout <= 0 {
|
||
|
rwh.ReadTimeout = DefaultReadTimeout
|
||
|
} else {
|
||
|
rwh.ReadTimeout = rwh.ReadTimeout * time.Second
|
||
|
}
|
||
|
|
||
|
if rwh.WriteTimeout <= 0 {
|
||
|
rwh.WriteTimeout = DefaultWriteTimeout
|
||
|
} else {
|
||
|
rwh.WriteTimeout = rwh.WriteTimeout * time.Second
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|