@@ -1126,21 +1126,34 @@ func readRequest(b *bufio.Reader) (req *Request, err error) {
1126
1126
// MaxBytesReader is similar to io.LimitReader but is intended for
1127
1127
// limiting the size of incoming request bodies. In contrast to
1128
1128
// io.LimitReader, MaxBytesReader's result is a ReadCloser, returns a
1129
- // non-EOF error for a Read beyond the limit, and closes the
1129
+ // MaxBytesError for a Read beyond the limit, and closes the
1130
1130
// underlying reader when its Close method is called.
1131
1131
//
1132
1132
// MaxBytesReader prevents clients from accidentally or maliciously
1133
- // sending a large request and wasting server resources.
1133
+ // sending a large request and wasting server resources. If possible,
1134
+ // it tells the ResponseWriter to close the connection after the limit
1135
+ // has been reached.
1134
1136
func MaxBytesReader (w ResponseWriter , r io.ReadCloser , n int64 ) io.ReadCloser {
1135
1137
if n < 0 { // Treat negative limits as equivalent to 0.
1136
1138
n = 0
1137
1139
}
1138
- return & maxBytesReader {w : w , r : r , n : n }
1140
+ return & maxBytesReader {w : w , r : r , i : n , n : n }
1141
+ }
1142
+
1143
+ // MaxBytesError is returned by MaxBytesReader when its read limit is exceeded.
1144
+ type MaxBytesError struct {
1145
+ Limit int64
1146
+ }
1147
+
1148
+ func (e * MaxBytesError ) Error () string {
1149
+ // Due to Hyrum's law, this text cannot be changed.
1150
+ return "http: request body too large"
1139
1151
}
1140
1152
1141
1153
type maxBytesReader struct {
1142
1154
w ResponseWriter
1143
1155
r io.ReadCloser // underlying reader
1156
+ i int64 // max bytes initially, for MaxBytesError
1144
1157
n int64 // max bytes remaining
1145
1158
err error // sticky error
1146
1159
}
@@ -1182,7 +1195,7 @@ func (l *maxBytesReader) Read(p []byte) (n int, err error) {
1182
1195
if res , ok := l .w .(requestTooLarger ); ok {
1183
1196
res .requestTooLarge ()
1184
1197
}
1185
- l .err = errors . New ( "http: request body too large" )
1198
+ l .err = & MaxBytesError { l . i }
1186
1199
return n , l .err
1187
1200
}
1188
1201
0 commit comments