server-go/readwrite-handler.go

102 lines
2.6 KiB
Go
Raw Normal View History

2018-04-04 13:28:35 +00:00
package server
import (
2018-04-13 07:11:43 +00:00
"sync/atomic"
2018-04-04 13:28:35 +00:00
"time"
)
type ReadWriteHandler interface {
GetMaxMessageSize() int64
GetReadBufferSize() int
GetWriteBufferSize() int
GetReadTimeout() time.Duration
GetWriteTimeout() time.Duration
}
type ReadWriteHandlers struct {
2018-04-14 08:49:33 +00:00
MaxMessageSize int64 `json:"maxMessageSize,omitempty"`
2018-04-04 13:28:35 +00:00
// 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.
2018-04-14 08:49:33 +00:00
ReadBufferSize int `json:"readBufferSize,omitempty"`
2018-04-04 13:28:35 +00:00
// Per-connection buffer size for responses' writing.
//
// Default buffer size is used if not set.
2018-04-14 08:49:33 +00:00
WriteBufferSize int `json:"writeBufferSize,omitempty"`
2018-04-04 13:28:35 +00:00
// 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.
2018-04-14 08:49:33 +00:00
ReadTimeout time.Duration `json:"readTimeout,omitempty"`
2018-04-04 13:28:35 +00:00
// Maximum duration for writing the full response (including body).
//
// By default response write timeout is unlimited.
2018-04-14 08:49:33 +00:00
WriteTimeout time.Duration `json:"writeTimeout,omitempty"`
2018-04-13 07:11:43 +00:00
validated atomic.Value
2018-04-04 13:28:35 +00:00
}
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
}
2018-04-05 15:15:29 +00:00
2018-04-12 05:55:01 +00:00
func (rwh *ReadWriteHandlers) Clone() *ReadWriteHandlers {
return &ReadWriteHandlers{
MaxMessageSize: rwh.MaxMessageSize,
ReadBufferSize: rwh.ReadBufferSize,
WriteBufferSize: rwh.WriteBufferSize,
ReadTimeout: rwh.ReadTimeout,
WriteTimeout: rwh.WriteTimeout,
2018-04-13 07:11:43 +00:00
validated: rwh.validated,
2018-04-12 05:55:01 +00:00
}
}
2018-04-04 13:28:35 +00:00
func (rwh *ReadWriteHandlers) Validate() error {
2018-04-13 07:11:43 +00:00
if nil != rwh.validated.Load() {
return nil
}
rwh.validated.Store(true)
2018-04-04 13:28:35 +00:00
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
2018-04-13 06:37:27 +00:00
} else {
rwh.ReadTimeout = rwh.ReadTimeout * time.Second
2018-04-04 13:28:35 +00:00
}
2018-04-13 06:37:27 +00:00
2018-04-04 13:28:35 +00:00
if rwh.WriteTimeout <= 0 {
rwh.WriteTimeout = DefaultWriteTimeout
2018-04-13 06:37:27 +00:00
} else {
rwh.WriteTimeout = rwh.WriteTimeout * time.Second
2018-04-04 13:28:35 +00:00
}
return nil
}