feat: expose HTTP2 header and protocol limits
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"math/big"
|
||||
"net"
|
||||
"net/http"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
@@ -175,6 +176,46 @@ func TestServerRejectsBodyAboveLimitAndRecovers(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestServerRejectsHeadersAboveLimitAndRecovers(t *testing.T) {
|
||||
server := New(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
||||
_, _ = io.WriteString(writer, "ok")
|
||||
}))
|
||||
server.MaxHeaderBytes = 1024
|
||||
address, stop := startServer(t, server)
|
||||
defer stop()
|
||||
transport := &xhttp2.Transport{
|
||||
AllowHTTP: true,
|
||||
DialTLSContext: func(ctx context.Context, network, address string, _ *tls.Config) (net.Conn, error) {
|
||||
return (&net.Dialer{}).DialContext(ctx, network, address)
|
||||
},
|
||||
}
|
||||
client := &http.Client{Transport: transport, Timeout: 3 * time.Second}
|
||||
defer transport.CloseIdleConnections()
|
||||
|
||||
request, err := http.NewRequest(http.MethodGet, "http://"+address+"/too-large", nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
request.Header.Set("X-Large", strings.Repeat("x", 2048))
|
||||
response, err := client.Do(request)
|
||||
if err == nil {
|
||||
response.Body.Close()
|
||||
if response.StatusCode < http.StatusBadRequest {
|
||||
t.Fatalf("oversized headers unexpectedly succeeded with status %d", response.StatusCode)
|
||||
}
|
||||
}
|
||||
|
||||
response, err = client.Get("http://" + address + "/recovered")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
body, readErr := io.ReadAll(response.Body)
|
||||
response.Body.Close()
|
||||
if readErr != nil || response.StatusCode != http.StatusOK || string(body) != "ok" {
|
||||
t.Fatalf("header limit did not recover: status=%d body=%q err=%v", response.StatusCode, body, readErr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestServerMultiplexes128Streams(t *testing.T) {
|
||||
started := make(chan struct{}, 128)
|
||||
release := make(chan struct{})
|
||||
@@ -196,7 +237,8 @@ func TestServerMultiplexes128Streams(t *testing.T) {
|
||||
address, stop := startServer(t, server)
|
||||
defer stop()
|
||||
transport := &xhttp2.Transport{
|
||||
AllowHTTP: true,
|
||||
AllowHTTP: true,
|
||||
StrictMaxConcurrentStreams: true,
|
||||
DialTLSContext: func(ctx context.Context, network, address string, _ *tls.Config) (net.Conn, error) {
|
||||
return (&net.Dialer{}).DialContext(ctx, network, address)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user