@@ -17,6 +17,7 @@ package caddyhttp
17
17
import (
18
18
"bufio"
19
19
"fmt"
20
+ "io"
20
21
"net"
21
22
"net/http"
22
23
"sync"
@@ -42,7 +43,11 @@ func init() {
42
43
//
43
44
// This listener wrapper must be placed BEFORE the "tls" listener
44
45
// wrapper, for it to work properly.
45
- type HTTPRedirectListenerWrapper struct {}
46
+ type HTTPRedirectListenerWrapper struct {
47
+ // MaxHeaderBytes is the maximum size to parse from a client's
48
+ // HTTP request headers. Default: 1 MB
49
+ MaxHeaderBytes int64 `json:"max_header_bytes,omitempty"`
50
+ }
46
51
47
52
func (HTTPRedirectListenerWrapper ) CaddyModule () caddy.ModuleInfo {
48
53
return caddy.ModuleInfo {
@@ -56,14 +61,15 @@ func (h *HTTPRedirectListenerWrapper) UnmarshalCaddyfile(d *caddyfile.Dispenser)
56
61
}
57
62
58
63
func (h * HTTPRedirectListenerWrapper ) WrapListener (l net.Listener ) net.Listener {
59
- return & httpRedirectListener {l }
64
+ return & httpRedirectListener {l , h . MaxHeaderBytes }
60
65
}
61
66
62
67
// httpRedirectListener is listener that checks the first few bytes
63
68
// of the request when the server is intended to accept HTTPS requests,
64
69
// to respond to an HTTP request with a redirect.
65
70
type httpRedirectListener struct {
66
71
net.Listener
72
+ maxHeaderBytes int64
67
73
}
68
74
69
75
// Accept waits for and returns the next connection to the listener,
@@ -74,9 +80,14 @@ func (l *httpRedirectListener) Accept() (net.Conn, error) {
74
80
return nil , err
75
81
}
76
82
83
+ maxHeaderBytes := l .maxHeaderBytes
84
+ if maxHeaderBytes == 0 {
85
+ maxHeaderBytes = 1024 * 1024
86
+ }
87
+
77
88
return & httpRedirectConn {
78
89
Conn : c ,
79
- r : bufio .NewReader (c ),
90
+ r : bufio .NewReader (io . LimitReader ( c , maxHeaderBytes ) ),
80
91
}, nil
81
92
}
82
93
0 commit comments