mirror of
https://github.com/valyala/fasthttp.git
synced 2026-06-26 17:46:34 +03:00
a696949f6c
* Dropping support for 1.15. * Replaces Go 1.16 Deprecated functions * Update test build flag * Fix import sort and comment * Update github.com/klauspost/compress to v1.15.9 https://github.com/klauspost/compress improved performance and changed Minimum version is 1.16, this should be the final supported release for Go 1.16 (https://github.com/klauspost/compress/commit/6d0019a95afa3221f7522d1f2eed0033b5e79470) .
136 lines
2.6 KiB
Go
136 lines
2.6 KiB
Go
//go:build !windows
|
|
// +build !windows
|
|
|
|
package fasthttp
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// See issue #1232
|
|
func TestRstConnResponseWhileSending(t *testing.T) {
|
|
const expectedStatus = http.StatusTeapot
|
|
const payload = "payload"
|
|
|
|
srv, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer srv.Close()
|
|
|
|
go func() {
|
|
for {
|
|
conn, err := srv.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// Read at least one byte of the header
|
|
// Otherwise we would have an unsolicited response
|
|
_, err = io.ReadAll(io.LimitReader(conn, 1))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
// Respond
|
|
_, err = conn.Write([]byte("HTTP/1.1 418 Teapot\r\n\r\n"))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
// Forcefully close connection
|
|
err = conn.(*net.TCPConn).SetLinger(0)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
conn.Close()
|
|
}
|
|
}()
|
|
|
|
svrUrl := "http://" + srv.Addr().String()
|
|
client := HostClient{Addr: srv.Addr().String()}
|
|
|
|
for i := 0; i < 100; i++ {
|
|
req := AcquireRequest()
|
|
defer ReleaseRequest(req)
|
|
resp := AcquireResponse()
|
|
defer ReleaseResponse(resp)
|
|
|
|
req.Header.SetMethod("POST")
|
|
req.SetBodyStream(strings.NewReader(payload), len(payload))
|
|
req.SetRequestURI(svrUrl)
|
|
|
|
err = client.Do(req, resp)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if expectedStatus != resp.StatusCode() {
|
|
t.Fatalf("Expected %d status code, but got %d", expectedStatus, resp.StatusCode())
|
|
}
|
|
}
|
|
}
|
|
|
|
// See issue #1232
|
|
func TestRstConnClosedWithoutResponse(t *testing.T) {
|
|
const payload = "payload"
|
|
|
|
srv, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer srv.Close()
|
|
|
|
go func() {
|
|
for {
|
|
conn, err := srv.Accept()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// Read at least one byte of the header
|
|
// Otherwise we would have an unsolicited response
|
|
_, err = io.ReadAll(io.LimitReader(conn, 1))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
// Respond with incomplete header
|
|
_, err = conn.Write([]byte("Http"))
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
// Forcefully close connection
|
|
err = conn.(*net.TCPConn).SetLinger(0)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
conn.Close()
|
|
}
|
|
}()
|
|
|
|
svrUrl := "http://" + srv.Addr().String()
|
|
client := HostClient{Addr: srv.Addr().String()}
|
|
|
|
for i := 0; i < 100; i++ {
|
|
req := AcquireRequest()
|
|
defer ReleaseRequest(req)
|
|
resp := AcquireResponse()
|
|
defer ReleaseResponse(resp)
|
|
|
|
req.Header.SetMethod("POST")
|
|
req.SetBodyStream(strings.NewReader(payload), len(payload))
|
|
req.SetRequestURI(svrUrl)
|
|
|
|
err = client.Do(req, resp)
|
|
|
|
if !isConnectionReset(err) {
|
|
t.Fatal("Expected connection reset error")
|
|
}
|
|
}
|
|
}
|