@@ -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
21912206func 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) {
28692884func 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-
31743187func 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 {
32273240func 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.
33803388type ErrNothingRead struct {
0 commit comments