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 }