From 32793db72d04141d333eb04ce60170db6e79e6d2 Mon Sep 17 00:00:00 2001 From: Erik Dubbelboer Date: Sat, 16 Nov 2019 15:38:01 +0100 Subject: [PATCH] Run golangci-lint using a Github Action --- .github/workflows/lint.yml | 10 + allocation_test.go | 2 +- args.go | 2 +- args_test.go | 4 +- bytesconv.go | 4 +- bytesconv_timing_test.go | 2 +- client.go | 12 +- client_test.go | 65 ++--- client_timing_test.go | 22 +- compress.go | 6 +- cookie.go | 2 +- fasthttpadaptor/adaptor.go | 2 +- fasthttpadaptor/adaptor_test.go | 2 +- fasthttputil/inmemory_listener_test.go | 2 +- fasthttputil/inmemory_listener_timing_test.go | 2 +- fasthttputil/pipeconns.go | 4 +- fs.go | 6 +- fs_test.go | 6 +- header.go | 8 +- header_test.go | 16 +- http.go | 56 ++-- http_test.go | 56 ++-- lbclient.go | 2 +- nocopy.go | 2 +- server.go | 38 ++- server_test.go | 261 +++++++++--------- server_timing_test.go | 8 +- stackless/writer.go | 5 +- stream_test.go | 2 +- uri.go | 2 +- uri_test.go | 8 +- workerpool_test.go | 18 +- 32 files changed, 335 insertions(+), 302 deletions(-) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..c5f9e4a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,10 @@ +name: lint + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: GolangCI-Lint Action + uses: actions-contrib/golangci-lint@v0.1.0 diff --git a/allocation_test.go b/allocation_test.go index 57edc03..cdb4aaa 100644 --- a/allocation_test.go +++ b/allocation_test.go @@ -48,7 +48,7 @@ func TestAllocationClient(t *testing.T) { Handler: func(ctx *RequestCtx) { }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{} url := "http://test:test@" + ln.Addr().String() + "/foo?bar=baz" diff --git a/args.go b/args.go index e5865cd..b3ad7e0 100644 --- a/args.go +++ b/args.go @@ -44,7 +44,7 @@ var argsPool = &sync.Pool{ // // Args instance MUST NOT be used from concurrently running goroutines. type Args struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck args []argsKV buf []byte diff --git a/args_test.go b/args_test.go index 722c6ce..83a1256 100644 --- a/args_test.go +++ b/args_test.go @@ -336,8 +336,8 @@ func testCopyTo(t *testing.T, a *Args) { var b Args a.CopyTo(&b) - if !reflect.DeepEqual(*a, b) { - t.Fatalf("ArgsCopyTo fail, a: \n%+v\nb: \n%+v\n", *a, b) + if !reflect.DeepEqual(*a, b) { //nolint:govet + t.Fatalf("ArgsCopyTo fail, a: \n%+v\nb: \n%+v\n", *a, b) //nolint:govet } b.VisitAll(func(k, v []byte) { diff --git a/bytesconv.go b/bytesconv.go index 2766794..e8fbabb 100644 --- a/bytesconv.go +++ b/bytesconv.go @@ -273,7 +273,9 @@ func readHexInt(r *bufio.Reader) (int, error) { if i == 0 { return -1, errEmptyHexNum } - r.UnreadByte() + if err := r.UnreadByte(); err != nil { + return -1, err + } return n, nil } if i >= maxHexIntChars { diff --git a/bytesconv_timing_test.go b/bytesconv_timing_test.go index b747181..34795df 100644 --- a/bytesconv_timing_test.go +++ b/bytesconv_timing_test.go @@ -71,7 +71,7 @@ func BenchmarkWriteHexInt(b *testing.B) { bw := bufio.NewWriter(&w) i := 0 for pb.Next() { - writeHexInt(bw, i) + writeHexInt(bw, i) //nolint:errcheck i++ if i > 0x7fffffff { i = 0 diff --git a/client.go b/client.go index 472ef63..b5ffc00 100644 --- a/client.go +++ b/client.go @@ -153,7 +153,7 @@ var defaultClient Client // // It is safe calling Client methods from concurrently running goroutines. type Client struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Client name. Used in User-Agent request header. // @@ -517,7 +517,7 @@ type DialFunc func(addr string) (net.Conn, error) // // It is safe calling HostClient methods from concurrently running goroutines. type HostClient struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Comma-separated list of upstream HTTP server host addresses, // which are passed to Dial in a round-robin manner. @@ -803,7 +803,9 @@ func clientPostURL(dst []byte, url string, postArgs *Args, c clientDoer) (status req.Header.SetMethodBytes(strPost) req.Header.SetContentTypeBytes(strPostArgsContentType) if postArgs != nil { - postArgs.WriteTo(req.BodyWriter()) + if _, err := postArgs.WriteTo(req.BodyWriter()); err != nil { + return 0, nil, err + } } statusCode, body, err = doRequestFollowRedirects(req, dst, url, c) @@ -1708,7 +1710,7 @@ func addMissingPort(addr string, isTLS bool) string { // It is safe calling PipelineClient methods from concurrently running // goroutines. type PipelineClient struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Address of the host to connect to. Addr string @@ -1788,7 +1790,7 @@ type PipelineClient struct { } type pipelineConnClient struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck Addr string MaxPendingRequests int diff --git a/client_test.go b/client_test.go index 1167bd9..5a681ff 100644 --- a/client_test.go +++ b/client_test.go @@ -37,7 +37,7 @@ func TestClientURLAuth(t *testing.T) { ch <- string(ctx.Request.Header.Peek(HeaderAuthorization)) }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{ Dial: func(addr string) (net.Conn, error) { return ln.Dial() @@ -70,7 +70,7 @@ func TestClientNilResp(t *testing.T) { Handler: func(ctx *RequestCtx) { }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{ Dial: func(addr string) (net.Conn, error) { return ln.Dial() @@ -94,10 +94,9 @@ func TestClientParseConn(t *testing.T) { ln, _ := net.Listen(network, "127.0.0.1:0") s := &Server{ Handler: func(ctx *RequestCtx) { - return }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck host := ln.Addr().String() c := &Client{} req, res := AcquireRequest(), AcquireResponse() @@ -106,7 +105,9 @@ func TestClientParseConn(t *testing.T) { ReleaseResponse(res) }() req.SetRequestURI("http://" + host + "") - c.Do(req, res) + if err := c.Do(req, res); err != nil { + t.Fatal(err) + } if res.RemoteAddr().Network() != network { t.Fatalf("req RemoteAddr parse network fail: %s, hope: %s", res.RemoteAddr().Network(), network) @@ -131,10 +132,10 @@ func TestClientPostArgs(t *testing.T) { if len(body) == 0 { return } - ctx.Write(body) + ctx.Write(body) //nolint:errcheck }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{ Dial: func(addr string) (net.Conn, error) { return ln.Dial() @@ -294,7 +295,7 @@ func testClientRedirectChangingSchemaServer(t *testing.T, https, http net.Listen go func() { err := s.Serve(ln) if err != nil { - t.Fatalf("unexpected error returned from Serve(): %s", err) + t.Errorf("unexpected error returned from Serve(): %s", err) } close(ch) }() @@ -315,9 +316,9 @@ func TestClientHeaderCase(t *testing.T) { go func() { c, err := ln.Accept() if err != nil { - t.Fatal(err) + t.Error(err) } - c.Write([]byte("HTTP/1.1 200 OK\r\n" + + c.Write([]byte("HTTP/1.1 200 OK\r\n" + //nolint:errcheck "content-type: text/plain\r\n" + "transfer-encoding: chunked\r\n\r\n" + "24\r\nThis is the data in the first chunk \r\n" + @@ -368,7 +369,7 @@ func TestClientReadTimeout(t *testing.T) { }, Logger: &testLogger{}, // Don't print closed pipe errors. } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &HostClient{ ReadTimeout: time.Second * 4, @@ -402,7 +403,7 @@ func TestClientReadTimeout(t *testing.T) { req.SetRequestURI("http://localhost") req.SetConnectionClose() - c.Do(req, res) + c.Do(req, res) //nolint:errcheck ReleaseRequest(req) ReleaseResponse(res) @@ -429,7 +430,7 @@ func TestClientDefaultUserAgent(t *testing.T) { userAgentSeen = string(ctx.UserAgent()) }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{ Dial: func(addr string) (net.Conn, error) { @@ -461,7 +462,7 @@ func TestClientSetUserAgent(t *testing.T) { userAgentSeen = string(ctx.UserAgent()) }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck userAgent := "I'm not fasthttp" c := &Client{ @@ -493,7 +494,7 @@ func TestClientNoUserAgent(t *testing.T) { userAgentSeen = string(ctx.UserAgent()) }, } - go s.Serve(ln) + go s.Serve(ln) //nolint:errcheck c := &Client{ NoDefaultUserAgentHeader: true, @@ -641,14 +642,14 @@ func testPipelineClientDoConcurrent(t *testing.T, concurrency int, maxBatchDelay s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("OK") + ctx.WriteString("OK") //nolint:errcheck }, } serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -743,7 +744,7 @@ func TestClientDoTimeoutDisableHeaderNamesNormalizing(t *testing.T) { serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -798,7 +799,7 @@ func TestClientDoTimeoutDisablePathNormalizing(t *testing.T) { serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -851,7 +852,7 @@ func TestHostClientPendingRequests(t *testing.T) { serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -945,13 +946,13 @@ func TestHostClientMaxConnsWithDeadline(t *testing.T) { emptyBodyCount++ } - ctx.WriteString("foo") + ctx.WriteString("foo") //nolint:errcheck }, } serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -981,18 +982,18 @@ func TestHostClientMaxConnsWithDeadline(t *testing.T) { time.Sleep(time.Millisecond) continue } - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } break } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code %d. Expecting %d", resp.StatusCode(), StatusOK) + t.Errorf("unexpected status code %d. Expecting %d", resp.StatusCode(), StatusOK) } body := resp.Body() if string(body) != "foo" { - t.Fatalf("unexpected body %q. Expecting %q", body, "abcd") + t.Errorf("unexpected body %q. Expecting %q", body, "abcd") } }() } @@ -1020,7 +1021,7 @@ func TestHostClientMaxConnDuration(t *testing.T) { connectionCloseCount := uint32(0) s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("abcd") + ctx.WriteString("abcd") //nolint:errcheck if ctx.Request.ConnectionClose() { atomic.AddUint32(&connectionCloseCount, 1) } @@ -1029,7 +1030,7 @@ func TestHostClientMaxConnDuration(t *testing.T) { serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -1077,14 +1078,14 @@ func TestHostClientMultipleAddrs(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.Write(ctx.Host()) + ctx.Write(ctx.Host()) //nolint:errcheck ctx.SetConnectionClose() }, } serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -1154,7 +1155,7 @@ func TestClientFollowRedirects(t *testing.T) { serverStopCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverStopCh) }() @@ -1883,7 +1884,7 @@ func startEchoServerExt(t *testing.T, network, addr string, isTLS bool) *testEch if ctx.IsGet() { ctx.Success("text/plain", ctx.URI().FullURI()) } else if ctx.IsPost() { - ctx.PostArgs().WriteTo(ctx) + ctx.PostArgs().WriteTo(ctx) //nolint:errcheck } }, Logger: &testLogger{}, // Ignore log output. @@ -1892,7 +1893,7 @@ func startEchoServerExt(t *testing.T, network, addr string, isTLS bool) *testEch go func() { err := s.Serve(ln) if err != nil { - t.Fatalf("unexpected error returned from Serve(): %s", err) + t.Errorf("unexpected error returned from Serve(): %s", err) } close(ch) }() diff --git a/client_timing_test.go b/client_timing_test.go index 1a97cd8..7beaaba 100644 --- a/client_timing_test.go +++ b/client_timing_test.go @@ -187,7 +187,7 @@ func fasthttpEchoHandler(ctx *RequestCtx) { func nethttpEchoHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set(HeaderContentType, "text/plain") - w.Write([]byte(r.RequestURI)) + w.Write([]byte(r.RequestURI)) //nolint:errcheck } func BenchmarkClientGetEndToEnd1TCP(b *testing.B) { @@ -213,7 +213,7 @@ func benchmarkClientGetEndToEndTCP(b *testing.B, parallelism int) { ch := make(chan struct{}) go func() { if err := Serve(ln, fasthttpEchoHandler); err != nil { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -274,7 +274,7 @@ func benchmarkNetHTTPClientGetEndToEndTCP(b *testing.B, parallelism int) { go func() { if err := http.Serve(ln, http.HandlerFunc(nethttpEchoHandler)); err != nil && !strings.Contains( err.Error(), "use of closed network connection") { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -342,7 +342,7 @@ func benchmarkClientGetEndToEndInmemory(b *testing.B, parallelism int) { ch := make(chan struct{}) go func() { if err := Serve(ln, fasthttpEchoHandler); err != nil { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -403,7 +403,7 @@ func benchmarkNetHTTPClientGetEndToEndInmemory(b *testing.B, parallelism int) { go func() { if err := http.Serve(ln, http.HandlerFunc(nethttpEchoHandler)); err != nil && !strings.Contains( err.Error(), "use of closed network connection") { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -458,7 +458,7 @@ func benchmarkClientEndToEndBigResponseInmemory(b *testing.B, parallelism int) { bigResponse := createFixedBody(1024 * 1024) h := func(ctx *RequestCtx) { ctx.SetContentType("text/plain") - ctx.Write(bigResponse) + ctx.Write(bigResponse) //nolint:errcheck } ln := fasthttputil.NewInmemoryListener() @@ -466,7 +466,7 @@ func benchmarkClientEndToEndBigResponseInmemory(b *testing.B, parallelism int) { ch := make(chan struct{}) go func() { if err := Serve(ln, h); err != nil { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -517,7 +517,7 @@ func benchmarkNetHTTPClientEndToEndBigResponseInmemory(b *testing.B, parallelism bigResponse := createFixedBody(1024 * 1024) h := func(w http.ResponseWriter, r *http.Request) { w.Header().Set(HeaderContentType, "text/plain") - w.Write(bigResponse) + w.Write(bigResponse) //nolint:errcheck } ln := fasthttputil.NewInmemoryListener() @@ -525,7 +525,7 @@ func benchmarkNetHTTPClientEndToEndBigResponseInmemory(b *testing.B, parallelism go func() { if err := http.Serve(ln, http.HandlerFunc(h)); err != nil && !strings.Contains( err.Error(), "use of closed network connection") { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() @@ -591,14 +591,14 @@ func BenchmarkPipelineClient1000(b *testing.B) { func benchmarkPipelineClient(b *testing.B, parallelism int) { h := func(ctx *RequestCtx) { - ctx.WriteString("foobar") + ctx.WriteString("foobar") //nolint:errcheck } ln := fasthttputil.NewInmemoryListener() ch := make(chan struct{}) go func() { if err := Serve(ln, h); err != nil { - b.Fatalf("error when serving requests: %s", err) + b.Errorf("error when serving requests: %s", err) } close(ch) }() diff --git a/compress.go b/compress.go index 73a40d3..6550c9e 100644 --- a/compress.go +++ b/compress.go @@ -134,7 +134,7 @@ var ( // * CompressHuffmanOnly func AppendGzipBytesLevel(dst, src []byte, level int) []byte { w := &byteSliceWriter{dst} - WriteGzipLevel(w, src, level) + WriteGzipLevel(w, src, level) //nolint:errcheck return w.b } @@ -230,7 +230,7 @@ func AppendGunzipBytes(dst, src []byte) ([]byte, error) { // * CompressHuffmanOnly func AppendDeflateBytesLevel(dst, src []byte, level int) []byte { w := &byteSliceWriter{dst} - WriteDeflateLevel(w, src, level) + WriteDeflateLevel(w, src, level) //nolint:errcheck return w.b } @@ -415,7 +415,7 @@ func isFileCompressible(f *os.File, minCompressRatio float64) bool { } _, err := copyZeroAlloc(zw, lr) releaseStacklessGzipWriter(zw, CompressDefaultCompression) - f.Seek(0, 0) + f.Seek(0, 0) //nolint:errcheck if err != nil { return false } diff --git a/cookie.go b/cookie.go index fb6618a..9e9bd87 100644 --- a/cookie.go +++ b/cookie.go @@ -65,7 +65,7 @@ var cookiePool = &sync.Pool{ // // Cookie instance MUST NOT be used from concurrently running goroutines. type Cookie struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck key []byte value []byte diff --git a/fasthttpadaptor/adaptor.go b/fasthttpadaptor/adaptor.go index 46b19aa..296ef7c 100644 --- a/fasthttpadaptor/adaptor.go +++ b/fasthttpadaptor/adaptor.go @@ -90,7 +90,7 @@ func NewFastHTTPHandler(h http.Handler) fasthttp.RequestHandler { ctx.Response.Header.Set(k, v) } } - ctx.Write(w.body) + ctx.Write(w.body) //nolint:errcheck } } diff --git a/fasthttpadaptor/adaptor_test.go b/fasthttpadaptor/adaptor_test.go index 452711b..ba15534 100644 --- a/fasthttpadaptor/adaptor_test.go +++ b/fasthttpadaptor/adaptor_test.go @@ -96,7 +96,7 @@ func TestNewFastHTTPHandler(t *testing.T) { req.SetRequestURI(expectedRequestURI) req.Header.SetHost(expectedHost) req.Header.Add(fasthttp.HeaderTransferEncoding, expectedTransferEncoding) - req.BodyWriter().Write([]byte(expectedBody)) + req.BodyWriter().Write([]byte(expectedBody)) // nolint:errcheck for k, v := range expectedHeader { req.Header.Set(k, v) } diff --git a/fasthttputil/inmemory_listener_test.go b/fasthttputil/inmemory_listener_test.go index 19cec0c..5575ffe 100644 --- a/fasthttputil/inmemory_listener_test.go +++ b/fasthttputil/inmemory_listener_test.go @@ -137,7 +137,7 @@ func testInmemoryListenerHTTP(t *testing.T, f func(t *testing.T, client *http.Cl ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) defer cancel() - server.Shutdown(ctx) + server.Shutdown(ctx) //nolint:errcheck } func testInmemoryListenerHTTPSingle(t *testing.T, client *http.Client, content string) { diff --git a/fasthttputil/inmemory_listener_timing_test.go b/fasthttputil/inmemory_listener_timing_test.go index 2691813..a85f37f 100644 --- a/fasthttputil/inmemory_listener_timing_test.go +++ b/fasthttputil/inmemory_listener_timing_test.go @@ -163,7 +163,7 @@ func benchmarkExt(b *testing.B, h fasthttp.RequestHandler, bc *benchConfig) { } func streamingHandler(ctx *fasthttp.RequestCtx) { - ctx.WriteString("foobar") + ctx.WriteString("foobar") //nolint:errcheck } func handshakeHandler(ctx *fasthttp.RequestCtx) { diff --git a/fasthttputil/pipeconns.go b/fasthttputil/pipeconns.go index 3e45c84..62e8989 100644 --- a/fasthttputil/pipeconns.go +++ b/fasthttputil/pipeconns.go @@ -215,8 +215,8 @@ func (c *pipeConn) RemoteAddr() net.Addr { } func (c *pipeConn) SetDeadline(deadline time.Time) error { - c.SetReadDeadline(deadline) - c.SetWriteDeadline(deadline) + c.SetReadDeadline(deadline) //nolint:errcheck + c.SetWriteDeadline(deadline) //nolint:errcheck return nil } diff --git a/fs.go b/fs.go index 1e9b4ab..ca70f72 100644 --- a/fs.go +++ b/fs.go @@ -194,7 +194,7 @@ func NewPathPrefixStripper(prefixSize int) PathRewriteFunc { // // It is prohibited copying FS values. Create new values instead. type FS struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Path to the root directory to serve files from. Root string @@ -1193,7 +1193,9 @@ func readFileHeader(f *os.File, compressed bool) ([]byte, error) { N: 512, } data, err := ioutil.ReadAll(lr) - f.Seek(0, 0) + if _, err := f.Seek(0, 0); err != nil { + return nil, err + } if zr != nil { releaseGzipReader(zr) diff --git a/fs_test.go b/fs_test.go index 19d1f30..539c1b9 100644 --- a/fs_test.go +++ b/fs_test.go @@ -100,7 +100,7 @@ func TestPathNotFoundFunc(t *testing.T) { t.Parallel() testPathNotFound(t, func(ctx *RequestCtx) { - ctx.WriteString("Not found hehe") + ctx.WriteString("Not found hehe") //nolint:errcheck }) } @@ -538,14 +538,14 @@ func TestFileLock(t *testing.T) { filePath := fmt.Sprintf("foo/bar/%d.jpg", i) lock := getFileLock(filePath) lock.Lock() - lock.Unlock() + lock.Unlock() // nolint:staticcheck } for i := 0; i < 10; i++ { filePath := fmt.Sprintf("foo/bar/%d.jpg", i) lock := getFileLock(filePath) lock.Lock() - lock.Unlock() + lock.Unlock() // nolint:staticcheck } } diff --git a/header.go b/header.go index 399b486..ba647a1 100644 --- a/header.go +++ b/header.go @@ -18,7 +18,7 @@ import ( // ResponseHeader instance MUST NOT be used from concurrently running // goroutines. type ResponseHeader struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck disableNormalizing bool noHTTP11 bool @@ -46,7 +46,7 @@ type ResponseHeader struct { // RequestHeader instance MUST NOT be used from concurrently running // goroutines. type RequestHeader struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck disableNormalizing bool noHTTP11 bool @@ -1283,7 +1283,7 @@ func (h *ResponseHeader) Cookie(cookie *Cookie) bool { if v == nil { return false } - cookie.ParseBytes(v) + cookie.ParseBytes(v) //nolint:errcheck return true } @@ -1978,7 +1978,7 @@ func (h *RequestHeader) parseRawHeaders() { if len(h.rawHeaders) == 0 { return } - h.parseHeaders(h.rawHeaders) + h.parseHeaders(h.rawHeaders) //nolint:errcheck } func (h *RequestHeader) collectCookies() { diff --git a/header_test.go b/header_test.go index 7819e44..2f1a564 100644 --- a/header_test.go +++ b/header_test.go @@ -1144,8 +1144,8 @@ func TestResponseHeaderCopyTo(t *testing.T) { h.bufKV = argsKV{} h1.bufKV = argsKV{} - if !reflect.DeepEqual(h, h1) { - t.Fatalf("ResponseHeaderCopyTo fail, src: \n%+v\ndst: \n%+v\n", h, h1) + if !reflect.DeepEqual(h, h1) { //nolint:govet + t.Fatalf("ResponseHeaderCopyTo fail, src: \n%+v\ndst: \n%+v\n", h, h1) //nolint:govet } } @@ -1178,8 +1178,8 @@ func TestRequestHeaderCopyTo(t *testing.T) { h.bufKV = argsKV{} h1.bufKV = argsKV{} - if !reflect.DeepEqual(h, h1) { - t.Fatalf("RequestHeaderCopyTo fail, src: \n%+v\ndst: \n%+v\n", h, h1) + if !reflect.DeepEqual(h, h1) { //nolint:govet + t.Fatalf("RequestHeaderCopyTo fail, src: \n%+v\ndst: \n%+v\n", h, h1) //nolint:govet } } @@ -1193,8 +1193,8 @@ func TestResponseContentTypeNoDefaultNotEmpty(t *testing.T) { headers := h.String() - if strings.Index(headers, "Content-Type: \r\n") != -1 { - t.Fatalf("ResponseContentTypeNoDefaultNotEmpty fail, response: \n%+v\noutcome: \n%q\n", h, headers) + if strings.Contains(headers, "Content-Type: \r\n") { + t.Fatalf("ResponseContentTypeNoDefaultNotEmpty fail, response: \n%+v\noutcome: \n%q\n", h, headers) //nolint:govet } } @@ -1477,7 +1477,9 @@ func TestResponseHeaderCookie(t *testing.T) { h.VisitAllCookie(func(key, value []byte) { var cc Cookie - cc.ParseBytes(value) + if err := cc.ParseBytes(value); err != nil { + t.Fatal(err) + } if !bytes.Equal(key, cc.Key()) { t.Fatalf("Unexpected cookie key %q. Expected %q", key, cc.Key()) } diff --git a/http.go b/http.go index 65a008a..e221690 100644 --- a/http.go +++ b/http.go @@ -22,7 +22,7 @@ import ( // // Request instance MUST NOT be used from concurrently running goroutines. type Request struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Request header // @@ -58,7 +58,7 @@ type Request struct { // // Response instance MUST NOT be used from concurrently running goroutines. type Response struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Response header // @@ -318,7 +318,7 @@ func (resp *Response) Body() []byte { bodyBuf := resp.bodyBuffer() bodyBuf.Reset() _, err := copyZeroAlloc(bodyBuf, resp.bodyStream) - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck if err != nil { bodyBuf.SetString(err.Error()) } @@ -421,7 +421,7 @@ func inflateData(p []byte) ([]byte, error) { func (req *Request) BodyWriteTo(w io.Writer) error { if req.bodyStream != nil { _, err := copyZeroAlloc(w, req.bodyStream) - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck return err } if req.onlyMultipartForm() { @@ -435,7 +435,7 @@ func (req *Request) BodyWriteTo(w io.Writer) error { func (resp *Response) BodyWriteTo(w io.Writer) error { if resp.bodyStream != nil { _, err := copyZeroAlloc(w, resp.bodyStream) - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck return err } _, err := w.Write(resp.bodyBytes()) @@ -451,8 +451,8 @@ func (resp *Response) AppendBody(p []byte) { // AppendBodyString appends s to response body. func (resp *Response) AppendBodyString(s string) { - resp.closeBodyStream() - resp.bodyBuffer().WriteString(s) + resp.closeBodyStream() //nolint:errcheck + resp.bodyBuffer().WriteString(s) //nolint:errcheck } // SetBody sets response body. @@ -464,16 +464,16 @@ func (resp *Response) SetBody(body []byte) { // SetBodyString sets response body. func (resp *Response) SetBodyString(body string) { - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck bodyBuf := resp.bodyBuffer() bodyBuf.Reset() - bodyBuf.WriteString(body) + bodyBuf.WriteString(body) //nolint:errcheck } // ResetBody resets response body. func (resp *Response) ResetBody() { resp.bodyRaw = nil - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck if resp.body != nil { if resp.keepBodyBuffer { resp.body.Reset() @@ -502,7 +502,7 @@ func (resp *Response) SetBodyRaw(body []byte) { func (resp *Response) ReleaseBody(size int) { resp.bodyRaw = nil if cap(resp.body.B) > size { - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck resp.body = nil } } @@ -516,7 +516,7 @@ func (resp *Response) ReleaseBody(size int) { // The majority of workloads don't need this method. func (req *Request) ReleaseBody(size int) { if cap(req.body.B) > size { - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck req.body = nil } } @@ -532,7 +532,7 @@ func (resp *Response) SwapBody(body []byte) []byte { if resp.bodyStream != nil { bb.Reset() _, err := copyZeroAlloc(bb, resp.bodyStream) - resp.closeBodyStream() + resp.closeBodyStream() //nolint:errcheck if err != nil { bb.Reset() bb.SetString(err.Error()) @@ -557,7 +557,7 @@ func (req *Request) SwapBody(body []byte) []byte { if req.bodyStream != nil { bb.Reset() _, err := copyZeroAlloc(bb, req.bodyStream) - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck if err != nil { bb.Reset() bb.SetString(err.Error()) @@ -577,7 +577,7 @@ func (req *Request) Body() []byte { bodyBuf := req.bodyBuffer() bodyBuf.Reset() _, err := copyZeroAlloc(bodyBuf, req.bodyStream) - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck if err != nil { bodyBuf.SetString(err.Error()) } @@ -601,8 +601,8 @@ func (req *Request) AppendBody(p []byte) { // AppendBodyString appends s to request body. func (req *Request) AppendBodyString(s string) { req.RemoveMultipartFormFiles() - req.closeBodyStream() - req.bodyBuffer().WriteString(s) + req.closeBodyStream() //nolint:errcheck + req.bodyBuffer().WriteString(s) //nolint:errcheck } // SetBody sets request body. @@ -615,14 +615,14 @@ func (req *Request) SetBody(body []byte) { // SetBodyString sets request body. func (req *Request) SetBodyString(body string) { req.RemoveMultipartFormFiles() - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck req.bodyBuffer().SetString(body) } // ResetBody resets request body. func (req *Request) ResetBody() { req.RemoveMultipartFormFiles() - req.closeBodyStream() + req.closeBodyStream() //nolint:errcheck if req.body != nil { if req.keepBodyBuffer { req.body.Reset() @@ -862,7 +862,7 @@ func (req *Request) RemoveMultipartFormFiles() { if req.multipartForm != nil { // Do not check for error, since these files may be deleted or moved // to new places by user code. - req.multipartForm.RemoveAll() + req.multipartForm.RemoveAll() //nolint:errcheck req.multipartForm = nil } req.multipartFormBoundary = "" @@ -1291,7 +1291,7 @@ func (resp *Response) gzipBody(level int) error { wf: zw, bw: sw, } - copyZeroAlloc(fw, bs) + copyZeroAlloc(fw, bs) //nolint:errcheck releaseStacklessGzipWriter(zw, level) if bsc, ok := bs.(io.Closer); ok { bsc.Close() @@ -1346,7 +1346,7 @@ func (resp *Response) deflateBody(level int) error { wf: zw, bw: sw, } - copyZeroAlloc(fw, bs) + copyZeroAlloc(fw, bs) //nolint:errcheck releaseStacklessDeflateWriter(zw, level) if bsc, ok := bs.(io.Closer); ok { bsc.Close() @@ -1657,9 +1657,15 @@ var copyBufPool = sync.Pool{ func writeChunk(w *bufio.Writer, b []byte) error { n := len(b) - writeHexInt(w, n) - w.Write(strCRLF) - w.Write(b) + if err := writeHexInt(w, n); err != nil { + return err + } + if _, err := w.Write(strCRLF); err != nil { + return err + } + if _, err := w.Write(b); err != nil { + return err + } _, err := w.Write(strCRLF) err1 := w.Flush() if err == nil { diff --git a/http_test.go b/http_test.go index be0b8cb..bde8a97 100644 --- a/http_test.go +++ b/http_test.go @@ -58,8 +58,8 @@ func testRequestCopyTo(t *testing.T, src *Request) { var dst Request src.CopyTo(&dst) - if !reflect.DeepEqual(*src, dst) { - t.Fatalf("RequestCopyTo fail, src: \n%+v\ndst: \n%+v\n", *src, dst) + if !reflect.DeepEqual(*src, dst) { //nolint:govet + t.Fatalf("RequestCopyTo fail, src: \n%+v\ndst: \n%+v\n", *src, dst) //nolint:govet } } @@ -67,8 +67,8 @@ func testResponseCopyTo(t *testing.T, src *Response) { var dst Response src.CopyTo(&dst) - if !reflect.DeepEqual(*src, dst) { - t.Fatalf("ResponseCopyTo fail, src: \n%+v\ndst: \n%+v\n", *src, dst) + if !reflect.DeepEqual(*src, dst) { //nolint:govet + t.Fatalf("ResponseCopyTo fail, src: \n%+v\ndst: \n%+v\n", *src, dst) //nolint:govet } } @@ -901,10 +901,10 @@ func TestResponseGzipStream(t *testing.T) { fmt.Fprintf(w, "foo") w.Flush() time.Sleep(time.Millisecond) - w.Write([]byte("barbaz")) - w.Flush() + w.Write([]byte("barbaz")) //nolint:errcheck + w.Flush() //nolint:errcheck time.Sleep(time.Millisecond) - fmt.Fprintf(w, "1234") + fmt.Fprintf(w, "1234") //nolint:errcheck if err := w.Flush(); err != nil { t.Fatalf("unexpected error: %s", err) } @@ -923,11 +923,11 @@ func TestResponseDeflateStream(t *testing.T) { t.Fatalf("IsBodyStream must return false") } r.SetBodyStreamWriter(func(w *bufio.Writer) { - w.Write([]byte("foo")) - w.Flush() - fmt.Fprintf(w, "barbaz") - w.Flush() - w.Write([]byte("1234")) + w.Write([]byte("foo")) //nolint:errcheck + w.Flush() //nolint:errcheck + fmt.Fprintf(w, "barbaz") //nolint:errcheck + w.Flush() //nolint:errcheck + w.Write([]byte("1234")) //nolint:errcheck if err := w.Flush(); err != nil { t.Fatalf("unexpected error: %s", err) } @@ -1773,43 +1773,39 @@ func testResponseReadSuccess(t *testing.T, resp *Response, response string, expe func TestReadBodyFixedSize(t *testing.T) { t.Parallel() - var b []byte - // zero-size body - testReadBodyFixedSize(t, b, 0) + testReadBodyFixedSize(t, 0) // small-size body - testReadBodyFixedSize(t, b, 3) + testReadBodyFixedSize(t, 3) // medium-size body - testReadBodyFixedSize(t, b, 1024) + testReadBodyFixedSize(t, 1024) // large-size body - testReadBodyFixedSize(t, b, 1024*1024) + testReadBodyFixedSize(t, 1024*1024) // smaller body after big one - testReadBodyFixedSize(t, b, 34345) + testReadBodyFixedSize(t, 34345) } func TestReadBodyChunked(t *testing.T) { t.Parallel() - var b []byte - // zero-size body - testReadBodyChunked(t, b, 0) + testReadBodyChunked(t, 0) // small-size body - testReadBodyChunked(t, b, 5) + testReadBodyChunked(t, 5) // medium-size body - testReadBodyChunked(t, b, 43488) + testReadBodyChunked(t, 43488) // big body - testReadBodyChunked(t, b, 3*1024*1024) + testReadBodyChunked(t, 3*1024*1024) // smaler body after big one - testReadBodyChunked(t, b, 12343) + testReadBodyChunked(t, 12343) } func TestRequestURITLS(t *testing.T) { @@ -1926,7 +1922,7 @@ func testRequestPostArgsSuccess(t *testing.T, req *Request, s string, expectedAr } } -func testReadBodyChunked(t *testing.T, b []byte, bodySize int) { +func testReadBodyChunked(t *testing.T, bodySize int) { body := createFixedBody(bodySize) chunkedBody := createChunkedBody(body) expectedTrailer := []byte("chunked shit") @@ -1944,7 +1940,7 @@ func testReadBodyChunked(t *testing.T, b []byte, bodySize int) { verifyTrailer(t, br, string(expectedTrailer)) } -func testReadBodyFixedSize(t *testing.T, b []byte, bodySize int) { +func testReadBodyFixedSize(t *testing.T, bodySize int) { body := createFixedBody(bodySize) expectedTrailer := []byte("traler aaaa") bodyWithTrailer := append(body, expectedTrailer...) @@ -2123,7 +2119,7 @@ func TestResponseImmediateHeaderFlushFixedLength(t *testing.T) { go func() { if err := bw.Write(bb); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } waitForIt <- struct{}{} }() @@ -2168,7 +2164,7 @@ func TestResponseImmediateHeaderFlushChunked(t *testing.T) { go func() { if err := bw.Write(bb); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } waitForIt <- struct{}{} diff --git a/lbclient.go b/lbclient.go index 932ce97..46d14b7 100644 --- a/lbclient.go +++ b/lbclient.go @@ -25,7 +25,7 @@ type BalancingClient interface { // // It is safe calling LBClient methods from concurrently running goroutines. type LBClient struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Clients must contain non-zero clients list. // Incoming requests are balanced among these clients. diff --git a/nocopy.go b/nocopy.go index 8e9b89a..9664cb0 100644 --- a/nocopy.go +++ b/nocopy.go @@ -5,7 +5,7 @@ package fasthttp // // See https://github.com/golang/go/issues/8005#issuecomment-190753527 for details. // and also: https://stackoverflow.com/questions/52494458/nocopy-minimal-example -type noCopy struct{} +type noCopy struct{} //nolint:unused func (*noCopy) Lock() {} func (*noCopy) Unlock() {} diff --git a/server.go b/server.go index b501431..96a41ac 100644 --- a/server.go +++ b/server.go @@ -148,7 +148,7 @@ type ServeHandler func(c net.Conn) error // // It is safe to call Server methods from concurrently running goroutines. type Server struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Handler for processing incoming requests. // @@ -457,9 +457,9 @@ func CompressHandlerLevel(h RequestHandler, level int) RequestHandler { return func(ctx *RequestCtx) { h(ctx) if ctx.Request.Header.HasAcceptEncodingBytes(strGzip) { - ctx.Response.gzipBody(level) + ctx.Response.gzipBody(level) //nolint:errcheck } else if ctx.Request.Header.HasAcceptEncodingBytes(strDeflate) { - ctx.Response.deflateBody(level) + ctx.Response.deflateBody(level) //nolint:errcheck } } } @@ -479,7 +479,7 @@ func CompressHandlerLevel(h RequestHandler, level int) RequestHandler { // running goroutines. The only exception is TimeoutError*, which may be called // while other goroutines accessing RequestCtx. type RequestCtx struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck // Incoming request. // @@ -1357,9 +1357,15 @@ func (ln tcpKeepaliveListener) Accept() (net.Conn, error) { if err != nil { return nil, err } - tc.SetKeepAlive(true) + if err := tc.SetKeepAlive(true); err != nil { + tc.Close() //nolint:errcheck + return nil, err + } if ln.keepalivePeriod > 0 { - tc.SetKeepAlivePeriod(ln.keepalivePeriod) + if err := tc.SetKeepAlivePeriod(ln.keepalivePeriod); err != nil { + tc.Close() //nolint:errcheck + return nil, err + } } return tc, nil } @@ -1981,7 +1987,10 @@ func (s *Server) serveConn(c net.Conn) error { if bw == nil { bw = acquireWriter(ctx) } - bw.Write(strResponseContinue) + _, err = bw.Write(strResponseContinue) + if err != nil { + break + } err = bw.Flush() if err != nil { break @@ -2105,10 +2114,15 @@ func (s *Server) serveConn(c net.Conn) error { releaseWriter(s, bw) bw = nil } - c.SetReadDeadline(zeroTime) - c.SetWriteDeadline(zeroTime) + err = c.SetReadDeadline(zeroTime) + if err != nil { + break + } + err = c.SetWriteDeadline(zeroTime) + if err != nil { + break + } go hijackConnHandler(hjr, c, s, hijackHandler) - hijackHandler = nil err = errHijacked break } @@ -2453,7 +2467,7 @@ func (s *Server) getServerName() []byte { } func (s *Server) writeFastError(w io.Writer, statusCode int, msg string) { - w.Write(statusLine(statusCode)) + w.Write(statusLine(statusCode)) //nolint:errcheck server := "" if !s.NoDefaultServerHeader { @@ -2493,7 +2507,7 @@ func (s *Server) writeErrorResponse(bw *bufio.Writer, ctx *RequestCtx, serverNam if bw == nil { bw = acquireWriter(ctx) } - writeResponse(ctx, bw) + writeResponse(ctx, bw) //nolint:errcheck bw.Flush() return bw } diff --git a/server_test.go b/server_test.go index 0b3a80d..8f3d135 100644 --- a/server_test.go +++ b/server_test.go @@ -29,7 +29,7 @@ func TestServerInvalidHeader(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { if ctx.Request.Header.Peek("Foo") != nil || ctx.Request.Header.Peek("Foo ") != nil { - t.Fatal("expected Foo header") + t.Error("expected Foo header") } }, Logger: &testLogger{}, @@ -39,7 +39,7 @@ func TestServerInvalidHeader(t *testing.T) { go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } }() @@ -104,7 +104,7 @@ func TestServerConnState(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -113,24 +113,24 @@ func TestServerConnState(t *testing.T) { go func() { c, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c) // Send 2 requests on the same connection. for i := 0; i < 2; i++ { if _, err = c.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } var resp Response if err := resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) + t.Errorf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) } } if err := c.Close(); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } // Give the server a little bit of time to transition the connection to the close state. time.Sleep(time.Millisecond * 100) @@ -310,7 +310,7 @@ func TestServerErrSmallBuffer(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("shouldn't be never called") + ctx.WriteString("shouldn't be never called") //nolint:errcheck }, ReadBufferSize: 20, } @@ -446,7 +446,7 @@ func TestServerResponseServerHeader(t *testing.T) { if string(name) != serverName { fmt.Fprintf(ctx, "unexpected server name: %q. Expecting %q", name, serverName) } else { - ctx.WriteString("OK") + ctx.WriteString("OK") //nolint:errcheck } // make sure the server name is sent to the client after ctx.Response.Reset() @@ -460,7 +460,7 @@ func TestServerResponseServerHeader(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -469,28 +469,28 @@ func TestServerResponseServerHeader(t *testing.T) { go func() { c, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if _, err = c.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c) var resp Response if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusNotFound { - t.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusNotFound) + t.Errorf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusNotFound) } if string(resp.Body()) != "404 Page not found" { - t.Fatalf("unexpected body: %q. Expecting %q", resp.Body(), "404 Page not found") + t.Errorf("unexpected body: %q. Expecting %q", resp.Body(), "404 Page not found") } if string(resp.Header.Server()) != serverName { - t.Fatalf("unexpected server header: %q. Expecting %q", resp.Header.Server(), serverName) + t.Errorf("unexpected server header: %q. Expecting %q", resp.Header.Server(), serverName) } if err = c.Close(); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(clientCh) }() @@ -541,7 +541,7 @@ func TestServerResponseBodyStream(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := Serve(ln, h); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -550,37 +550,37 @@ func TestServerResponseBodyStream(t *testing.T) { go func() { c, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if _, err = c.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c) var respH ResponseHeader if err = respH.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if respH.StatusCode() != StatusOK { - t.Fatalf("unexpected status code: %d. Expecting %d", respH.StatusCode(), StatusOK) + t.Errorf("unexpected status code: %d. Expecting %d", respH.StatusCode(), StatusOK) } buf := make([]byte, 1024) n, err := br.Read(buf) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } b := buf[:n] if string(b) != "5\r\nfirst\r\n" { - t.Fatalf("unexpected result %q. Expecting %q", b, "5\r\nfirst\r\n") + t.Errorf("unexpected result %q. Expecting %q", b, "5\r\nfirst\r\n") } close(readyCh) tail, err := ioutil.ReadAll(br) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if string(tail) != "6\r\nsecond\r\n0\r\n\r\n" { - t.Fatalf("unexpected tail %q. Expecting %q", tail, "6\r\nsecond\r\n0\r\n\r\n") + t.Errorf("unexpected tail %q. Expecting %q", tail, "6\r\nsecond\r\n0\r\n\r\n") } close(clientCh) @@ -608,7 +608,7 @@ func TestServerDisableKeepalive(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("OK") + ctx.WriteString("OK") //nolint:errcheck }, DisableKeepalive: true, } @@ -618,7 +618,7 @@ func TestServerDisableKeepalive(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -627,33 +627,33 @@ func TestServerDisableKeepalive(t *testing.T) { go func() { c, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if _, err = c.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c) var resp Response if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) + t.Errorf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) } if !resp.ConnectionClose() { - t.Fatal("expecting 'Connection: close' response header") + t.Error("expecting 'Connection: close' response header") } if string(resp.Body()) != "OK" { - t.Fatalf("unexpected body: %q. Expecting %q", resp.Body(), "OK") + t.Errorf("unexpected body: %q. Expecting %q", resp.Body(), "OK") } // make sure the connection is closed data, err := ioutil.ReadAll(br) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if len(data) > 0 { - t.Fatalf("unexpected data read from the connection: %q. Expecting empty data", data) + t.Errorf("unexpected data read from the connection: %q. Expecting empty data", data) } close(clientCh) @@ -681,7 +681,7 @@ func TestServerMaxConnsPerIPLimit(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("OK") + ctx.WriteString("OK") //nolint:errcheck }, MaxConnsPerIP: 1, Logger: &testLogger{}, @@ -695,7 +695,7 @@ func TestServerMaxConnsPerIPLimit(t *testing.T) { Listener: ln, } if err := s.Serve(fakeLN); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -704,35 +704,35 @@ func TestServerMaxConnsPerIPLimit(t *testing.T) { go func() { c1, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } c2, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c2) var resp Response if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusTooManyRequests { - t.Fatalf("unexpected status code for the second connection: %d. Expecting %d", + t.Errorf("unexpected status code for the second connection: %d. Expecting %d", resp.StatusCode(), StatusTooManyRequests) } if _, err = c1.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error when writing to the first connection: %s", err) + t.Errorf("unexpected error when writing to the first connection: %s", err) } br = bufio.NewReader(c1) if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code for the first connection: %d. Expecting %d", + t.Errorf("unexpected status code for the first connection: %d. Expecting %d", resp.StatusCode(), StatusOK) } if string(resp.Body()) != "OK" { - t.Fatalf("unexpected body for the first connection: %q. Expecting %q", resp.Body(), "OK") + t.Errorf("unexpected body for the first connection: %q. Expecting %q", resp.Body(), "OK") } close(clientCh) }() @@ -785,7 +785,7 @@ func TestServerConcurrencyLimit(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.WriteString("OK") + ctx.WriteString("OK") //nolint:errcheck }, Concurrency: 1, Logger: &testLogger{}, @@ -796,7 +796,7 @@ func TestServerConcurrencyLimit(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(serverCh) }() @@ -805,35 +805,35 @@ func TestServerConcurrencyLimit(t *testing.T) { go func() { c1, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } c2, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(c2) var resp Response if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusServiceUnavailable { - t.Fatalf("unexpected status code for the second connection: %d. Expecting %d", + t.Errorf("unexpected status code for the second connection: %d. Expecting %d", resp.StatusCode(), StatusServiceUnavailable) } if _, err = c1.Write([]byte("GET / HTTP/1.1\r\nHost: aa\r\n\r\n")); err != nil { - t.Fatalf("unexpected error when writing to the first connection: %s", err) + t.Errorf("unexpected error when writing to the first connection: %s", err) } br = bufio.NewReader(c1) if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code for the first connection: %d. Expecting %d", + t.Errorf("unexpected status code for the first connection: %d. Expecting %d", resp.StatusCode(), StatusOK) } if string(resp.Body()) != "OK" { - t.Fatalf("unexpected body for the first connection: %q. Expecting %q", resp.Body(), "OK") + t.Errorf("unexpected body for the first connection: %q. Expecting %q", resp.Body(), "OK") } close(clientCh) }() @@ -901,7 +901,7 @@ func TestServerTLS(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { - ctx.Write(text) + ctx.Write(text) //nolint:errcheck }, } @@ -912,7 +912,7 @@ func TestServerTLS(t *testing.T) { go func() { err = s.ServeTLS(ln, "", "") if err != nil { - t.Fatal(err) + t.Error(err) } }() @@ -968,10 +968,10 @@ func TestServerServeTLSEmbed(t *testing.T) { ctx.Error(fmt.Sprintf("unexpected scheme=%q. Expecting %q", scheme, "https"), StatusBadRequest) return } - ctx.WriteString("success") + ctx.WriteString("success") //nolint:errcheck }) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -996,11 +996,11 @@ func TestServerServeTLSEmbed(t *testing.T) { br := bufio.NewReader(tlsConn) var resp Response if err := resp.Read(br); err != nil { - t.Fatal("unexpected error") + t.Error("unexpected error") } body := resp.Body() if string(body) != "success" { - t.Fatalf("unexpected response body %q. Expecting %q", body, "success") + t.Errorf("unexpected response body %q. Expecting %q", body, "success") } close(respCh) }() @@ -1059,21 +1059,21 @@ Connection: close case "/upload": f, err := ctx.MultipartForm() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if len(f.Value) != 1 { - t.Fatalf("unexpected values %d. Expecting %d", len(f.Value), 1) + t.Errorf("unexpected values %d. Expecting %d", len(f.Value), 1) } if len(f.File) != 1 { - t.Fatalf("unexpected file values %d. Expecting %d", len(f.File), 1) + t.Errorf("unexpected file values %d. Expecting %d", len(f.File), 1) } fv := ctx.FormValue("f1") if string(fv) != "value1" { - t.Fatalf("unexpected form value: %q. Expecting %q", fv, "value1") + t.Errorf("unexpected form value: %q. Expecting %q", fv, "value1") } ctx.Redirect("/", StatusSeeOther) default: - ctx.WriteString("non-upload") + ctx.WriteString("non-upload") //nolint:errcheck } }, } @@ -1081,7 +1081,7 @@ Connection: close ch := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -1099,25 +1099,25 @@ Connection: close respCh := make(chan struct{}) go func() { if err := resp.Read(br); err != nil { - t.Fatalf("error when reading response: %s", err) + t.Errorf("error when reading response: %s", err) } if resp.StatusCode() != StatusSeeOther { - t.Fatalf("unexpected status code %d. Expecting %d", resp.StatusCode(), StatusSeeOther) + t.Errorf("unexpected status code %d. Expecting %d", resp.StatusCode(), StatusSeeOther) } loc := resp.Header.Peek(HeaderLocation) if string(loc) != "http://qwerty.com/" { - t.Fatalf("unexpected location %q. Expecting %q", loc, "http://qwerty.com/") + t.Errorf("unexpected location %q. Expecting %q", loc, "http://qwerty.com/") } if err := resp.Read(br); err != nil { - t.Fatalf("error when reading the second response: %s", err) + t.Errorf("error when reading the second response: %s", err) } if resp.StatusCode() != StatusOK { - t.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) + t.Errorf("unexpected status code: %d. Expecting %d", resp.StatusCode(), StatusOK) } body := resp.Body() if string(body) != "non-upload" { - t.Fatalf("unexpected body %q. Expecting %q", body, "non-upload") + t.Errorf("unexpected body %q. Expecting %q", body, "non-upload") } close(respCh) }() @@ -1182,14 +1182,14 @@ func TestServerDisableHeaderNamesNormalizing(t *testing.T) { Handler: func(ctx *RequestCtx) { hv := ctx.Request.Header.Peek(headerName) if string(hv) != headerValue { - t.Fatalf("unexpected header value for %q: %q. Expecting %q", headerName, hv, headerValue) + t.Errorf("unexpected header value for %q: %q. Expecting %q", headerName, hv, headerValue) } hv = ctx.Request.Header.Peek(headerNameLower) if len(hv) > 0 { - t.Fatalf("unexpected header value for %q: %q. Expecting empty value", headerNameLower, hv) + t.Errorf("unexpected header value for %q: %q. Expecting empty value", headerNameLower, hv) } ctx.Response.Header.Set(headerName, headerValue) - ctx.WriteString("ok") + ctx.WriteString("ok") //nolint:errcheck ctx.SetContentType("aaa") }, DisableHeaderNamesNormalizing: true, @@ -1242,7 +1242,7 @@ func TestServerReduceMemoryUsageSerial(t *testing.T) { ch := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -1273,7 +1273,7 @@ func TestServerReduceMemoryUsageConcurrent(t *testing.T) { ch := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -1320,7 +1320,7 @@ func testServerRequests(t *testing.T, ln *fasthttputil.InmemoryListener) { respCh := make(chan struct{}) go func() { if err = resp.Read(br); err != nil { - t.Fatalf("unexpected error when reading response on iteration %d: %s", i, err) + t.Errorf("unexpected error when reading response on iteration %d: %s", i, err) } close(respCh) }() @@ -1349,7 +1349,7 @@ func TestServerHTTP10ConnectionKeepAlive(t *testing.T) { } }) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -1386,10 +1386,10 @@ func TestServerHTTP10ConnectionKeepAlive(t *testing.T) { go func() { tail, err := ioutil.ReadAll(br) if err != nil { - t.Fatalf("error when reading tail: %s", err) + t.Errorf("error when reading tail: %s", err) } if len(tail) > 0 { - t.Fatalf("unexpected non-zero tail %q", tail) + t.Errorf("unexpected non-zero tail %q", tail) } close(tailCh) }() @@ -1433,7 +1433,7 @@ func TestServerHTTP10ConnectionClose(t *testing.T) { ctx.Response.Header.Set(HeaderConnection, "keep-alive") }) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } close(ch) }() @@ -1461,10 +1461,10 @@ func TestServerHTTP10ConnectionClose(t *testing.T) { go func() { tail, err := ioutil.ReadAll(br) if err != nil { - t.Fatalf("error when reading tail: %s", err) + t.Errorf("error when reading tail: %s", err) } if len(tail) > 0 { - t.Fatalf("unexpected non-zero tail %q", tail) + t.Errorf("unexpected non-zero tail %q", tail) } close(tailCh) }() @@ -1607,19 +1607,19 @@ func TestServerExpect100Continue(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { if !ctx.IsPost() { - t.Fatalf("unexpected method %q. Expecting POST", ctx.Method()) + t.Errorf("unexpected method %q. Expecting POST", ctx.Method()) } if string(ctx.Path()) != "/foo" { - t.Fatalf("unexpected path %q. Expecting %q", ctx.Path(), "/foo") + t.Errorf("unexpected path %q. Expecting %q", ctx.Path(), "/foo") } ct := ctx.Request.Header.ContentType() if string(ct) != "a/b" { - t.Fatalf("unexpectected content-type: %q. Expecting %q", ct, "a/b") + t.Errorf("unexpectected content-type: %q. Expecting %q", ct, "a/b") } if string(ctx.PostBody()) != "12345" { - t.Fatalf("unexpected body: %q. Expecting %q", ctx.PostBody(), "12345") + t.Errorf("unexpected body: %q. Expecting %q", ctx.PostBody(), "12345") } - ctx.WriteString("foobar") + ctx.WriteString("foobar") //nolint:errcheck }, } @@ -1657,7 +1657,7 @@ func TestCompressHandler(t *testing.T) { expectedBody := string(createFixedBody(2e4)) h := CompressHandler(func(ctx *RequestCtx) { - ctx.Write([]byte(expectedBody)) + ctx.Write([]byte(expectedBody)) //nolint:errcheck }) var ctx RequestCtx @@ -1791,7 +1791,7 @@ func TestServeConnNonHTTP11KeepAlive(t *testing.T) { ctx.SuccessString("aaa/bbb", "foobar") }) if err != nil { - t.Fatalf("unexpected error in ServeConn: %s", err) + t.Errorf("unexpected error in ServeConn: %s", err) } close(ch) }() @@ -1854,7 +1854,7 @@ func TestRequestCtxSetBodyStreamWriter(t *testing.T) { ctx.SetBodyStreamWriter(func(w *bufio.Writer) { fmt.Fprintf(w, "body writer line 1\n") if err := w.Flush(); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } fmt.Fprintf(w, "body writer line 2\n") }) @@ -2032,7 +2032,7 @@ func TestRequestCtxHijack(t *testing.T) { s := &Server{ Handler: func(ctx *RequestCtx) { if ctx.Hijacked() { - t.Fatal("connection mustn't be hijacked") + t.Error("connection mustn't be hijacked") } ctx.Hijack(func(c net.Conn) { <-hijackStartCh @@ -2047,17 +2047,17 @@ func TestRequestCtxHijack(t *testing.T) { return } if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } - t.Fatalf("unexpected number of bytes read: %d. Expecting 1", n) + t.Errorf("unexpected number of bytes read: %d. Expecting 1", n) } if _, err = c.Write(b); err != nil { - t.Fatalf("unexpected error when writing data: %s", err) + t.Errorf("unexpected error when writing data: %s", err) } } }) if !ctx.Hijacked() { - t.Fatal("connection must be hijacked") + t.Error("connection must be hijacked") } ctx.Success("foo/bar", []byte("hijack it!")) }, @@ -2133,7 +2133,7 @@ func TestTimeoutHandlerSuccess(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } close(serverCh) }() @@ -2144,10 +2144,10 @@ func TestTimeoutHandlerSuccess(t *testing.T) { go func() { conn, err := ln.Dial() if err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } if _, err = conn.Write([]byte("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(conn) verifyResponse(t, br, StatusOK, "aaa/bbb", "real response") @@ -2191,7 +2191,7 @@ func TestTimeoutHandlerTimeout(t *testing.T) { serverCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } close(serverCh) }() @@ -2202,10 +2202,10 @@ func TestTimeoutHandlerTimeout(t *testing.T) { go func() { conn, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if _, err = conn.Write([]byte("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(conn) verifyResponse(t, br, StatusRequestTimeout, string(defaultContentType), "timeout!!!") @@ -2246,7 +2246,7 @@ func TestServerGetOnly(t *testing.T) { h := func(ctx *RequestCtx) { if !ctx.IsGet() { - t.Fatalf("non-get request: %q", ctx.Method()) + t.Errorf("non-get request: %q", ctx.Method()) } ctx.Success("foo/bar", []byte("success")) } @@ -2528,13 +2528,13 @@ func TestServerRequestNumAndTime(t *testing.T) { Handler: func(ctx *RequestCtx) { n++ if ctx.ConnRequestNum() != n { - t.Fatalf("unexpected request number: %d. Expecting %d", ctx.ConnRequestNum(), n) + t.Errorf("unexpected request number: %d. Expecting %d", ctx.ConnRequestNum(), n) } if connT.IsZero() { connT = ctx.ConnTime() } if ctx.ConnTime() != connT { - t.Fatalf("unexpected serve conn time: %s. Expecting %s", ctx.ConnTime(), connT) + t.Errorf("unexpected serve conn time: %s. Expecting %s", ctx.ConnTime(), connT) } }, } @@ -2836,11 +2836,11 @@ func TestShutdown(t *testing.T) { serveCh := make(chan struct{}) go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } _, err := ln.Dial() if err == nil { - t.Fatal("server is still listening") + t.Error("server is still listening") } serveCh <- struct{}{} }() @@ -2848,10 +2848,10 @@ func TestShutdown(t *testing.T) { go func() { conn, err := ln.Dial() if err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } if _, err = conn.Write([]byte("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } br := bufio.NewReader(conn) verifyResponse(t, br, StatusOK, "aaa/bbb", "real response") @@ -2861,7 +2861,7 @@ func TestShutdown(t *testing.T) { shutdownCh := make(chan struct{}) go func() { if err := s.Shutdown(); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } shutdownCh <- struct{}{} }() @@ -2896,7 +2896,7 @@ func TestShutdownReuse(t *testing.T) { } go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() conn, err := ln.Dial() @@ -2914,7 +2914,7 @@ func TestShutdownReuse(t *testing.T) { ln = fasthttputil.NewInmemoryListener() go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() conn, err = ln.Dial() @@ -2943,7 +2943,7 @@ func TestShutdownDone(t *testing.T) { } go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() conn, err := ln.Dial() @@ -2957,7 +2957,7 @@ func TestShutdownDone(t *testing.T) { // Shutdown won't return if the connection doesn't close, // which doesn't happen until we read the response. if err := s.Shutdown(); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() // We can only reach this point and get a valid response @@ -2982,7 +2982,7 @@ func TestShutdownErr(t *testing.T) { go func() { if err := s.Serve(ln); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() conn, err := ln.Dial() @@ -2996,7 +2996,7 @@ func TestShutdownErr(t *testing.T) { // Shutdown won't return if the connection doesn't close, // which doesn't happen until we read the response. if err := s.Shutdown(); err != nil { - t.Fatalf("unexepcted error: %s", err) + t.Errorf("unexepcted error: %s", err) } }() // We can only reach this point and get a valid response @@ -3046,7 +3046,7 @@ func TestMaxReadTimeoutPerRequest(t *testing.T) { headers := []byte(fmt.Sprintf("POST /foo2 HTTP/1.1\r\nHost: aaa.com\r\nContent-Length: %d\r\nContent-Type: aa\r\n\r\n", 5*1024)) s := &Server{ Handler: func(ctx *RequestCtx) { - t.Fatal("shouldn't reach handler") + t.Error("shouldn't reach handler") }, HeaderReceived: func(header *RequestHeader) RequestConfig { return RequestConfig{ @@ -3064,12 +3064,12 @@ func TestMaxReadTimeoutPerRequest(t *testing.T) { //write headers _, err := cc.Write(headers) if err != nil { - t.Fatal(err) + t.Error(err) } //write body for i := 0; i < 5*1024; i++ { time.Sleep(time.Millisecond) - cc.Write([]byte{'a'}) + cc.Write([]byte{'a'}) //nolint:errcheck } }() ch := make(chan error) @@ -3096,7 +3096,7 @@ func TestMaxWriteTimeoutPerRequest(t *testing.T) { ctx.SetBodyStreamWriter(func(w *bufio.Writer) { var buf [192]byte for { - w.Write(buf[:]) + w.Write(buf[:]) //nolint:errcheck } }) }, @@ -3118,18 +3118,18 @@ func TestMaxWriteTimeoutPerRequest(t *testing.T) { //write headers _, err := cc.Write(headers) if err != nil { - t.Fatal(err) + t.Error(err) } br := bufio.NewReaderSize(cc, 192) err = resp.Header.Read(br) if err != nil { - t.Fatal(err) + t.Error(err) } var chunk [192]byte for { time.Sleep(time.Millisecond) - br.Read(chunk[:]) + br.Read(chunk[:]) //nolint:errcheck } }() ch := make(chan error) @@ -3157,11 +3157,8 @@ func TestIncompleteBodyReturnsUnexpectedEOF(t *testing.T) { go func() { ch <- s.ServeConn(rw) }() - select { - case err := <-ch: - if err == nil || err.Error() != "unexpected EOF" { - t.Fatal(err) - } + if err := <-ch; err == nil || err.Error() != "unexpected EOF" { + t.Fatal(err) } } diff --git a/server_timing_test.go b/server_timing_test.go index d8893f6..4c6be4a 100644 --- a/server_timing_test.go +++ b/server_timing_test.go @@ -355,7 +355,7 @@ func benchmarkNetHTTPServerGet(b *testing.B, clientsCount, requestsPerConn int) if requestsPerConn == 1 { h.Set(HeaderConnection, "close") } - w.Write(fakeResponse) + w.Write(fakeResponse) //nolint:errcheck registerServedRequest(b, ch) }), } @@ -406,7 +406,7 @@ func benchmarkNetHTTPServerPost(b *testing.B, clientsCount, requestsPerConn int) if requestsPerConn == 1 { h.Set(HeaderConnection, "close") } - w.Write(body) + w.Write(body) //nolint:errcheck registerServedRequest(b, ch) }), } @@ -447,7 +447,9 @@ func benchmarkServer(b *testing.B, s realServer, clientsCount, requestsPerConn i ln := newFakeListener(b.N, clientsCount, requestsPerConn, request) ch := make(chan struct{}) go func() { - s.Serve(ln) + if err := s.Serve(ln); err != nil { + panic(err) + } ch <- struct{}{} }() diff --git a/stackless/writer.go b/stackless/writer.go index c2053f9..b0d3e8d 100644 --- a/stackless/writer.go +++ b/stackless/writer.go @@ -75,7 +75,7 @@ func (w *writer) Close() error { func (w *writer) Reset(dstW io.Writer) { w.xw.Reset() - w.do(opReset) + w.do(opReset) //nolint:errcheck w.dstW = dstW } @@ -125,8 +125,7 @@ func (w *xWriter) Write(p []byte) (int, error) { if w.bb == nil { w.bb = bufferPool.Get() } - w.bb.Write(p) - return len(p), nil + return w.bb.Write(p) } func (w *xWriter) Reset() { diff --git a/stream_test.go b/stream_test.go index 575c8eb..c5ce292 100644 --- a/stream_test.go +++ b/stream_test.go @@ -53,7 +53,7 @@ func TestStreamReaderClose(t *testing.T) { data := createFixedBody(4000) for i := 0; i < 100; i++ { - w.Write(data) + w.Write(data) //nolint:errcheck } if err := w.Flush(); err == nil { ch <- fmt.Errorf("expecting error on the second flush") diff --git a/uri.go b/uri.go index 1b78416..21ab3ae 100644 --- a/uri.go +++ b/uri.go @@ -36,7 +36,7 @@ var uriPool = &sync.Pool{ // // URI instance MUST NOT be used from concurrently running goroutines. type URI struct { - noCopy noCopy + noCopy noCopy //nolint:unused,structcheck pathOriginal []byte scheme []byte diff --git a/uri_test.go b/uri_test.go index 7126868..c90b4e1 100644 --- a/uri_test.go +++ b/uri_test.go @@ -214,14 +214,14 @@ func TestURICopyTo(t *testing.T) { var u URI var copyU URI u.CopyTo(©U) - if !reflect.DeepEqual(u, copyU) { - t.Fatalf("URICopyTo fail, u: \n%+v\ncopyu: \n%+v\n", u, copyU) + if !reflect.DeepEqual(u, copyU) { //nolint:govet + t.Fatalf("URICopyTo fail, u: \n%+v\ncopyu: \n%+v\n", u, copyU) //nolint:govet } u.UpdateBytes([]byte("https://google.com/foo?bar=baz&baraz#qqqq")) u.CopyTo(©U) - if !reflect.DeepEqual(u, copyU) { - t.Fatalf("URICopyTo fail, u: \n%+v\ncopyu: \n%+v\n", u, copyU) + if !reflect.DeepEqual(u, copyU) { //nolint:govet + t.Fatalf("URICopyTo fail, u: \n%+v\ncopyu: \n%+v\n", u, copyU) //nolint:govet } } diff --git a/workerpool_test.go b/workerpool_test.go index cdf01ab..65457f3 100644 --- a/workerpool_test.go +++ b/workerpool_test.go @@ -86,14 +86,14 @@ func testWorkerPoolMaxWorkersCount(t *testing.T) { buf := make([]byte, 100) n, err := conn.Read(buf) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } buf = buf[:n] if string(buf) != "foobar" { - t.Fatalf("unexpected data read: %q. Expecting %q", buf, "foobar") + t.Errorf("unexpected data read: %q. Expecting %q", buf, "foobar") } if _, err = conn.Write([]byte("baz")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } <-ready @@ -113,20 +113,20 @@ func testWorkerPoolMaxWorkersCount(t *testing.T) { go func() { conn, err := ln.Dial() if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if _, err = conn.Write([]byte("foobar")); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } data, err := ioutil.ReadAll(conn) if err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } if string(data) != "baz" { - t.Fatalf("unexpected value read: %q. Expecting %q", data, "baz") + t.Errorf("unexpected value read: %q. Expecting %q", data, "baz") } if err = conn.Close(); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } clientCh <- struct{}{} }() @@ -144,7 +144,7 @@ func testWorkerPoolMaxWorkersCount(t *testing.T) { go func() { if _, err := ln.Dial(); err != nil { - t.Fatalf("unexpected error: %s", err) + t.Errorf("unexpected error: %s", err) } }() conn, err := ln.Accept()