Currently, the only way to set URI for a request is to call SetRequestURI(string).
Then when a request performed the string will be parsed into a fasthttp.URI struct.
If there are many requests with the same URI then we'll waste CPU for a parsing of the same URI string.
With the new SetURI(*URI) method we can once parse a URI string into a fasthttp.URI struct and then reuse it for many requests.
Unfortunately the URI will be copied because may be modified inside the request.
But anyway this will be more lightweight than parsing.
* Adding zero-allocation uint64 to byte slice conversion and fixing the ResponseHeader.SetStatusLine function call signature
* Removing unnecessary i2b function
* Fixing various bugs
* Adding test cases
* Commenting AppendStatusLine
* Update status.go
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
* Update header.go
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
* Cleaning up references to strHTTP11, using formatStatusLine for invalidStatusLine, and making `appendStatusLine` an unexported function
Issue: https://github.com/valyala/fasthttp/issues/1132
* Fixing merge conflicts
Issue: https://github.com/valyala/fasthttp/issues/1132
* Replacing []byte{} with nil in some test cases
Issue: https://github.com/valyala/fasthttp/issues/1132
* Cleaning up parsing first line, and improving StatusMessage function
Issue: https://github.com/valyala/fasthttp/issues/1132
* Fixing as per PR
* Update header.go
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
* Update header.go
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
* Fixing as per requested changes
* Update header_test.go
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
* Adding ConvertHTTPRequest and renaming ConvertRequest to ConvertFastRequest
* Removing forServer boolean from ConvertHTTPRequest
* Preparing for PR
* Reverting adaptor changes
* Fixing godoc, adding req.ReadBody function as well
* Update comment to be more clear
As per @erikdubbelboer suggestion
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
Co-authored-by: Erik Dubbelboer <erik@dubbelboer.com>
The return value of normalizePath should be a reusable []byte.
Returning strSlash could cause the strSlash constant to be reused and
resulted in very weird behavior. This specific case of normalizePath
almost never happens which made it even harder to spot.
The race detector on Windows was the only clue that something was
happening:
WARNING: DATA RACE
Write at 0x000001d082e3 by goroutine 446:
github.com/valyala/fasthttp.addLeadingSlash()
D:/a/fasthttp/fasthttp/uri_windows.go:8 +0xa5
github.com/valyala/fasthttp.normalizePath()
D:/a/fasthttp/fasthttp/uri.go:343 +0xbd
github.com/valyala/fasthttp.(*URI).parse()
D:/a/fasthttp/fasthttp/uri.go:314 +0x1606
github.com/valyala/fasthttp.(*URI).Parse()
D:/a/fasthttp/fasthttp/uri.go:266 +0xb3
github.com/valyala/fasthttp.testURIPathNormalize()
D:/a/fasthttp/fasthttp/uri_test.go:195 +0x47
github.com/valyala/fasthttp.TestURIPathNormalize()
D:/a/fasthttp/fasthttp/uri_test.go:176 +0x38e
testing.tRunner()
C:/hostedtoolcache/windows/go/1.15.15/x64/src/testing/testing.go:1123 +0x202
Previous read at 0x000001d082e3 by goroutine 332:
runtime.slicecopy()
C:/hostedtoolcache/windows/go/1.15.15/x64/src/runtime/slice.go:246 +0x0
github.com/valyala/fasthttp.(*RequestHeader).AppendBytes()
D:/a/fasthttp/fasthttp/header.go:1726 +0x24d
github.com/valyala/fasthttp.(*RequestHeader).Header()
D:/a/fasthttp/fasthttp/header.go:1698 +0x84
github.com/valyala/fasthttp.(*RequestHeader).Write()
D:/a/fasthttp/fasthttp/header.go:1682 +0x10f
github.com/valyala/fasthttp.(*Request).Write()
D:/a/fasthttp/fasthttp/http.go:1370 +0x1ab
github.com/valyala/fasthttp.testRequestSuccess()
D:/a/fasthttp/fasthttp/http_test.go:1788 +0x32a
github.com/valyala/fasthttp.TestRequestSuccess()
D:/a/fasthttp/fasthttp/http_test.go:1678 +0x2dd
testing.tRunner()
C:/hostedtoolcache/windows/go/1.15.15/x64/src/testing/testing.go:1123 +0x202
* Fix various Windows Github Action errors
These tests keep giving errors because Windows Actions are slower.
* Remove some timeouts
We don't need timeouts in all tests, only in the ones where we are
actually testing timeout logic.
* Flush buffered responses if we have to wait for the next request
Don't wait for the next request as this can take some time, instead
flush the outstanding responses already.
Fixes#1043
* Only peek 1 byte
Make sure old clients that send bogus \r\n still work.
See: https://github.com/golang/go/commit/bf5e19fbaf02b1b25fbe50c27ec301fe830a28d0