aboutsummaryrefslogtreecommitdiffhomepage
path: root/modules/caddyhttp/requestbody/requestbody.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/caddyhttp/requestbody/requestbody.go')
-rw-r--r--modules/caddyhttp/requestbody/requestbody.go28
1 files changed, 28 insertions, 0 deletions
diff --git a/modules/caddyhttp/requestbody/requestbody.go b/modules/caddyhttp/requestbody/requestbody.go
index dfc0fd928..3cea7b4f9 100644
--- a/modules/caddyhttp/requestbody/requestbody.go
+++ b/modules/caddyhttp/requestbody/requestbody.go
@@ -17,9 +17,11 @@ package requestbody
import (
"io"
"net/http"
+ "time"
"github.com/caddyserver/caddy/v2"
"github.com/caddyserver/caddy/v2/modules/caddyhttp"
+ "go.uber.org/zap"
)
func init() {
@@ -31,6 +33,14 @@ type RequestBody struct {
// The maximum number of bytes to allow reading from the body by a later handler.
// If more bytes are read, an error with HTTP status 413 is returned.
MaxSize int64 `json:"max_size,omitempty"`
+
+ // EXPERIMENTAL. Subject to change/removal.
+ ReadTimeout time.Duration `json:"read_timeout,omitempty"`
+
+ // EXPERIMENTAL. Subject to change/removal.
+ WriteTimeout time.Duration `json:"write_timeout,omitempty"`
+
+ logger *zap.Logger
}
// CaddyModule returns the Caddy module information.
@@ -41,6 +51,11 @@ func (RequestBody) CaddyModule() caddy.ModuleInfo {
}
}
+func (rb *RequestBody) Provision(ctx caddy.Context) error {
+ rb.logger = ctx.Logger()
+ return nil
+}
+
func (rb RequestBody) ServeHTTP(w http.ResponseWriter, r *http.Request, next caddyhttp.Handler) error {
if r.Body == nil {
return next.ServeHTTP(w, r)
@@ -48,6 +63,19 @@ func (rb RequestBody) ServeHTTP(w http.ResponseWriter, r *http.Request, next cad
if rb.MaxSize > 0 {
r.Body = errorWrapper{http.MaxBytesReader(w, r.Body, rb.MaxSize)}
}
+ if rb.ReadTimeout > 0 || rb.WriteTimeout > 0 {
+ rc := http.NewResponseController(w)
+ if rb.ReadTimeout > 0 {
+ if err := rc.SetReadDeadline(time.Now().Add(rb.ReadTimeout)); err != nil {
+ rb.logger.Error("could not set read deadline", zap.Error(err))
+ }
+ }
+ if rb.WriteTimeout > 0 {
+ if err := rc.SetWriteDeadline(time.Now().Add(rb.WriteTimeout)); err != nil {
+ rb.logger.Error("could not set write deadline", zap.Error(err))
+ }
+ }
+ }
return next.ServeHTTP(w, r)
}