diff --git a/client_test.go b/client_test.go index 00765ab..1eab344 100644 --- a/client_test.go +++ b/client_test.go @@ -610,24 +610,30 @@ func TestClientDoWithCustomHeaders(t *testing.T) { } func TestPipelineClientDoSerial(t *testing.T) { + t.Parallel() + testPipelineClientDoConcurrent(t, 1, 0, 0) } func TestPipelineClientDoConcurrent(t *testing.T) { + t.Parallel() + testPipelineClientDoConcurrent(t, 10, 0, 1) } func TestPipelineClientDoBatchDelayConcurrent(t *testing.T) { + t.Parallel() + testPipelineClientDoConcurrent(t, 10, 5*time.Millisecond, 1) } func TestPipelineClientDoBatchDelayConcurrentMultiConn(t *testing.T) { + t.Parallel() + testPipelineClientDoConcurrent(t, 10, 5*time.Millisecond, 3) } func testPipelineClientDoConcurrent(t *testing.T, concurrency int, maxBatchDelay time.Duration, maxConns int) { - t.Parallel() - ln := fasthttputil.NewInmemoryListener() s := &Server{ diff --git a/fs_test.go b/fs_test.go index 5d53f68..19d1f30 100644 --- a/fs_test.go +++ b/fs_test.go @@ -435,6 +435,8 @@ func testParseByteRangeError(t *testing.T, v string, contentLength int) { } func TestFSCompressConcurrent(t *testing.T) { + // This test can't run parallel as files in / might by changed by other tests. + fs := &FS{ Root: ".", GenerateIndexPages: true, @@ -465,7 +467,7 @@ func TestFSCompressConcurrent(t *testing.T) { } func TestFSCompressSingleThread(t *testing.T) { - t.Parallel() + // This test can't run parallel as files in / might by changed by other tests. fs := &FS{ Root: ".", @@ -525,7 +527,7 @@ func testFSCompress(t *testing.T, h RequestHandler, filePath string) { t.Fatalf("unexpected error when gunzipping response body: %s. filePath=%q", err, filePath) } if string(zbody) != body { - t.Fatalf("unexpected body %q. Expected %q. FilePath=%q", zbody, body, filePath) + t.Fatalf("unexpected body len=%d. Expected len=%d. FilePath=%q", len(zbody), len(body), filePath) } } diff --git a/http.go b/http.go index d10c9b1..ddec400 100644 --- a/http.go +++ b/http.go @@ -704,7 +704,7 @@ func (req *Request) parseURI() { } req.parsedURI = true - req.uri.parseQuick(req.Header.RequestURI(), &req.Header, req.isTLS) + req.uri.parse(req.Header.Host(), req.Header.RequestURI(), req.isTLS) } // PostArgs returns POST arguments. diff --git a/uri.go b/uri.go index 913c86b..1b78416 100644 --- a/uri.go +++ b/uri.go @@ -62,8 +62,6 @@ type URI struct { username []byte password []byte - - h *RequestHeader } // CopyTo copies uri contents to dst. @@ -84,7 +82,6 @@ func (u *URI) CopyTo(dst *URI) { // fullURI and requestURI shouldn't be copied, since they are created // from scratch on each FullURI() and RequestURI() call. - dst.h = u.h } // Hash returns URI hash, i.e. qwe of http://aaa.com/foo/bar?baz=123#qwe . @@ -232,19 +229,12 @@ func (u *URI) Reset() { // There is no need in u.requestURI = u.requestURI[:0], since requestURI // is calculated on each call to RequestURI(). - - u.h = nil } // Host returns host part, i.e. aaa.com of http://aaa.com/foo/bar?baz=123#qwe . // // Host is always lowercased. func (u *URI) Host() []byte { - if len(u.host) == 0 && u.h != nil { - u.host = append(u.host[:0], u.h.Host()...) - lowercaseBytes(u.host) - u.h = nil - } return u.host } @@ -267,23 +257,18 @@ func (u *URI) SetHostBytes(host []byte) { // // uri may contain e.g. RequestURI without scheme and host if host is non-empty. func (u *URI) Parse(host, uri []byte) { - u.parse(host, uri, nil) + u.parse(host, uri, false) } -func (u *URI) parseQuick(uri []byte, h *RequestHeader, isTLS bool) { - u.parse(nil, uri, h) - if isTLS { - u.scheme = append(u.scheme[:0], strHTTPS...) - } -} - -func (u *URI) parse(host, uri []byte, h *RequestHeader) { +func (u *URI) parse(host, uri []byte, isTLS bool) { u.Reset() - u.h = h scheme, host, uri := splitHostURI(host, uri) u.scheme = append(u.scheme, scheme...) lowercaseBytes(u.scheme) + if isTLS { + u.scheme = append(u.scheme[:0], strHTTPS...) + } if n := bytes.Index(host, strAt); n >= 0 { auth := host[:n]