Skip to content

Commit a46f187

Browse files
authored
Merge pull request #2 from ReneWerner87/codex/2025-11-10-08-45-39
2 parents a38233e + 1517aee commit a46f187

File tree

4 files changed

+43
-35
lines changed

4 files changed

+43
-35
lines changed

header.go

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,22 @@ func (h *header) AddTrailer(trailer string) error {
463463
return h.AddTrailerBytes(s2b(trailer))
464464
}
465465

466-
var ErrBadTrailer = errors.New("contain forbidden trailer")
466+
var (
467+
ErrBadTrailer = errors.New("contain forbidden trailer")
468+
ErrReadingResponseHeaders = errors.New("error when reading response headers")
469+
ErrReadingResponseTrailer = errors.New("error when reading response trailer")
470+
ErrResponseFirstLineMissingSpace = errors.New("cannot find whitespace in the first line of response")
471+
ErrUnexpectedStatusCodeChar = errors.New("unexpected char at the end of status code")
472+
ErrMissingRequestMethod = errors.New("cannot find http request method")
473+
ErrUnsupportedRequestMethod = errors.New("unsupported http request method")
474+
ErrExtraWhitespaceInRequestLine = errors.New("extra whitespace in request line")
475+
ErrEmptyRequestURI = errors.New("requestURI cannot be empty")
476+
ErrDuplicateContentLength = errors.New("duplicate Content-Length header")
477+
ErrUnsupportedTransferEncoding = errors.New("unsupported Transfer-Encoding")
478+
ErrNonNumericChars = errors.New("non-numeric chars found")
479+
ErrNeedMore = errors.New("need more data: cannot find trailing lf")
480+
ErrSmallReadBuffer = errors.New("small read buffer. Increase ReadBufferSize")
481+
)
467482

468483
// AddTrailerBytes add Trailer header value for chunked response
469484
// to indicate which headers will be sent after the body.
@@ -2088,7 +2103,7 @@ func (h *ResponseHeader) Read(r *bufio.Reader) error {
20882103
if err == nil {
20892104
return nil
20902105
}
2091-
if err != errNeedMore {
2106+
if err != ErrNeedMore {
20922107
h.resetSkipNormalize()
20932108
return err
20942109
}
@@ -2113,11 +2128,11 @@ func (h *ResponseHeader) tryRead(r *bufio.Reader, n int) error {
21132128
if err == bufio.ErrBufferFull {
21142129
if h.secureErrorLogMessage {
21152130
return &ErrSmallBuffer{
2116-
error: errors.New("error when reading response headers"),
2131+
error: ErrReadingResponseHeaders,
21172132
}
21182133
}
21192134
return &ErrSmallBuffer{
2120-
error: fmt.Errorf("error when reading response headers: %w", errSmallBuffer),
2135+
error: fmt.Errorf("error when reading response headers: %w", ErrSmallReadBuffer),
21212136
}
21222137
}
21232138

@@ -2142,7 +2157,7 @@ func (h *header) ReadTrailer(r *bufio.Reader) error {
21422157
if err == nil {
21432158
return nil
21442159
}
2145-
if err != errNeedMore {
2160+
if err != ErrNeedMore {
21462161
return err
21472162
}
21482163
n = r.Buffered() + 1
@@ -2165,11 +2180,11 @@ func (h *header) tryReadTrailer(r *bufio.Reader, n int) error {
21652180
if err == bufio.ErrBufferFull {
21662181
if h.secureErrorLogMessage {
21672182
return &ErrSmallBuffer{
2168-
error: errors.New("error when reading response trailer"),
2183+
error: ErrReadingResponseTrailer,
21692184
}
21702185
}
21712186
return &ErrSmallBuffer{
2172-
error: fmt.Errorf("error when reading response trailer: %w", errSmallBuffer),
2187+
error: fmt.Errorf("error when reading response trailer: %w", ErrSmallReadBuffer),
21732188
}
21742189
}
21752190

@@ -2189,11 +2204,11 @@ func (h *header) tryReadTrailer(r *bufio.Reader, n int) error {
21892204
}
21902205

21912206
func headerError(typ string, err, errParse error, b []byte, secureErrorLogMessage bool) error {
2192-
if errParse != errNeedMore {
2207+
if errParse != ErrNeedMore {
21932208
return headerErrorMsg(typ, errParse, b, secureErrorLogMessage)
21942209
}
21952210
if err == nil {
2196-
return errNeedMore
2211+
return ErrNeedMore
21972212
}
21982213

21992214
// Buggy servers may leave trailing CRLFs after http body.
@@ -2206,7 +2221,7 @@ func headerError(typ string, err, errParse error, b []byte, secureErrorLogMessag
22062221
return headerErrorMsg(typ, err, b, secureErrorLogMessage)
22072222
}
22082223
return &ErrSmallBuffer{
2209-
error: headerErrorMsg(typ, errSmallBuffer, b, secureErrorLogMessage),
2224+
error: headerErrorMsg(typ, ErrSmallReadBuffer, b, secureErrorLogMessage),
22102225
}
22112226
}
22122227

@@ -2234,7 +2249,7 @@ func (h *RequestHeader) readLoop(r *bufio.Reader, waitForMore bool) error {
22342249
if err == nil {
22352250
return nil
22362251
}
2237-
if !waitForMore || err != errNeedMore {
2252+
if !waitForMore || err != ErrNeedMore {
22382253
h.resetSkipNormalize()
22392254
return err
22402255
}
@@ -2257,7 +2272,7 @@ func (h *RequestHeader) tryRead(r *bufio.Reader, n int) error {
22572272
// This is for go 1.6 bug. See https://github.com/golang/go/issues/14121 .
22582273
if err == bufio.ErrBufferFull {
22592274
return &ErrSmallBuffer{
2260-
error: fmt.Errorf("error when reading request headers: %w (n=%d, r.Buffered()=%d)", errSmallBuffer, n, r.Buffered()),
2275+
error: fmt.Errorf("error when reading request headers: %w (n=%d, r.Buffered()=%d)", ErrSmallReadBuffer, n, r.Buffered()),
22612276
}
22622277
}
22632278

@@ -2744,7 +2759,7 @@ func (h *ResponseHeader) parseFirstLine(buf []byte) (int, error) {
27442759
n := bytes.IndexByte(b, ' ')
27452760
if n < 0 {
27462761
if h.secureErrorLogMessage {
2747-
return 0, errors.New("cannot find whitespace in the first line of response")
2762+
return 0, ErrResponseFirstLineMissingSpace
27482763
}
27492764
return 0, fmt.Errorf("cannot find whitespace in the first line of response %q", buf)
27502765
}
@@ -2761,7 +2776,7 @@ func (h *ResponseHeader) parseFirstLine(buf []byte) (int, error) {
27612776
}
27622777
if len(b) > n && b[n] != ' ' {
27632778
if h.secureErrorLogMessage {
2764-
return 0, errors.New("unexpected char at the end of status code")
2779+
return 0, ErrUnexpectedStatusCodeChar
27652780
}
27662781
return 0, fmt.Errorf("unexpected char at the end of status code. Response %q", buf)
27672782
}
@@ -2795,15 +2810,15 @@ func (h *RequestHeader) parseFirstLine(buf []byte) (int, error) {
27952810
n := bytes.IndexByte(b, ' ')
27962811
if n <= 0 {
27972812
if h.secureErrorLogMessage {
2798-
return 0, errors.New("cannot find http request method")
2813+
return 0, ErrMissingRequestMethod
27992814
}
28002815
return 0, fmt.Errorf("cannot find http request method in %q", buf)
28012816
}
28022817
h.method = append(h.method[:0], b[:n]...)
28032818

28042819
if !isValidMethod(h.method) {
28052820
if h.secureErrorLogMessage {
2806-
return 0, errors.New("unsupported http request method")
2821+
return 0, ErrUnsupportedRequestMethod
28072822
}
28082823
return 0, fmt.Errorf("unsupported http request method %q in %q", h.method, buf)
28092824
}
@@ -2813,7 +2828,7 @@ func (h *RequestHeader) parseFirstLine(buf []byte) (int, error) {
28132828
// Check for extra whitespace after method - only one space should separate method from URI
28142829
if len(b) > 0 && b[0] == ' ' {
28152830
if h.secureErrorLogMessage {
2816-
return 0, errors.New("extra whitespace in request line")
2831+
return 0, ErrExtraWhitespaceInRequestLine
28172832
}
28182833
return 0, fmt.Errorf("extra whitespace in request line %q", buf)
28192834
}
@@ -2824,15 +2839,15 @@ func (h *RequestHeader) parseFirstLine(buf []byte) (int, error) {
28242839
return 0, fmt.Errorf("cannot find whitespace in the first line of request %q", buf)
28252840
} else if n == 0 {
28262841
if h.secureErrorLogMessage {
2827-
return 0, errors.New("requestURI cannot be empty")
2842+
return 0, ErrEmptyRequestURI
28282843
}
28292844
return 0, fmt.Errorf("requestURI cannot be empty in %q", buf)
28302845
}
28312846

28322847
// Check for extra whitespace - only one space should separate URI from HTTP version
28332848
if n+1 < len(b) && b[n+1] == ' ' {
28342849
if h.secureErrorLogMessage {
2835-
return 0, errors.New("extra whitespace in request line")
2850+
return 0, ErrExtraWhitespaceInRequestLine
28362851
}
28372852
return 0, fmt.Errorf("extra whitespace in request line %q", buf)
28382853
}
@@ -2869,7 +2884,7 @@ func (h *RequestHeader) parseFirstLine(buf []byte) (int, error) {
28692884
func readRawHeaders(dst, buf []byte) ([]byte, int, error) {
28702885
n := bytes.IndexByte(buf, nChar)
28712886
if n < 0 {
2872-
return dst[:0], 0, errNeedMore
2887+
return dst[:0], 0, ErrNeedMore
28732888
}
28742889
if (n == 1 && buf[0] == rChar) || n == 0 {
28752890
// empty headers
@@ -2883,7 +2898,7 @@ func readRawHeaders(dst, buf []byte) ([]byte, int, error) {
28832898
b = b[m:]
28842899
m = bytes.IndexByte(b, nChar)
28852900
if m < 0 {
2886-
return dst, 0, errNeedMore
2901+
return dst, 0, ErrNeedMore
28872902
}
28882903
m++
28892904
n += m
@@ -3077,7 +3092,7 @@ func (h *RequestHeader) parseHeaders(buf []byte) (int, error) {
30773092
if caseInsensitiveCompare(s.key, strContentLength) {
30783093
if contentLengthSeen {
30793094
h.connectionClose = true
3080-
return 0, errors.New("duplicate Content-Length header")
3095+
return 0, ErrDuplicateContentLength
30813096
}
30823097
contentLengthSeen = true
30833098

@@ -3110,7 +3125,7 @@ func (h *RequestHeader) parseHeaders(buf []byte) (int, error) {
31103125
if !isIdentity && !isChunked {
31113126
h.connectionClose = true
31123127
if h.secureErrorLogMessage {
3113-
return 0, errors.New("unsupported Transfer-Encoding")
3128+
return 0, ErrUnsupportedTransferEncoding
31143129
}
31153130
return 0, fmt.Errorf("unsupported Transfer-Encoding: %q", s.value)
31163131
}
@@ -3169,15 +3184,13 @@ func (h *RequestHeader) collectCookies() {
31693184
h.cookiesCollected = true
31703185
}
31713186

3172-
var errNonNumericChars = errors.New("non-numeric chars found")
3173-
31743187
func parseContentLength(b []byte) (int, error) {
31753188
v, n, err := parseUintBuf(b)
31763189
if err != nil {
31773190
return -1, fmt.Errorf("cannot parse Content-Length: %w", err)
31783191
}
31793192
if n != len(b) {
3180-
return -1, fmt.Errorf("cannot parse Content-Length: %w", errNonNumericChars)
3193+
return -1, fmt.Errorf("cannot parse Content-Length: %w", ErrNonNumericChars)
31813194
}
31823195
return v, nil
31833196
}
@@ -3227,7 +3240,7 @@ func hasHeaderValue(s, value []byte) bool {
32273240
func nextLine(b []byte) ([]byte, []byte, error) {
32283241
nNext := bytes.IndexByte(b, nChar)
32293242
if nNext < 0 {
3230-
return nil, nil, errNeedMore
3243+
return nil, nil, ErrNeedMore
32313244
}
32323245
n := nNext
32333246
if n > 0 && b[n-1] == rChar {
@@ -3370,11 +3383,6 @@ func copyTrailer(dst, src [][]byte) [][]byte {
33703383
return dst
33713384
}
33723385

3373-
var (
3374-
errNeedMore = errors.New("need more data: cannot find trailing lf")
3375-
errSmallBuffer = errors.New("small read buffer. Increase ReadBufferSize")
3376-
)
3377-
33783386
// ErrNothingRead is returned when a keep-alive connection is closed,
33793387
// either because the remote closed it or because of a read timeout.
33803388
type ErrNothingRead struct {

headerscanner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func (s *headerScanner) next() bool {
2727

2828
i := bytes.Index(s.b, strCRLFCRLF)
2929
if i < 0 {
30-
s.err = errNeedMore
30+
s.err = ErrNeedMore
3131
return false
3232
}
3333
i += 4

server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2314,7 +2314,7 @@ func (s *Server) serveConn(c net.Conn) error {
23142314
// outgoing buffer first so it doesn't have to wait.
23152315
if bw != nil && bw.Buffered() > 0 {
23162316
err = ctx.Request.Header.readLoop(br, false)
2317-
if err == errNeedMore {
2317+
if err == ErrNeedMore {
23182318
err = bw.Flush()
23192319
if err != nil {
23202320
break

server_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ func TestServerErrSmallBuffer(t *testing.T) {
500500
t.Fatal("missing 'Connection: close' response header")
501501
}
502502

503-
expectedErr := errSmallBuffer.Error()
503+
expectedErr := ErrSmallReadBuffer.Error()
504504
if !strings.Contains(serverErr.Error(), expectedErr) {
505505
t.Fatalf("unexpected log output: %v. Expecting %q", serverErr, expectedErr)
506506
}

0 commit comments

Comments
 (0)