diff --git a/go.mod b/go.mod index eee2e07658..92c7b8d76c 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module golang.org/x/net go 1.23.0 require ( - golang.org/x/crypto v0.38.0 + golang.org/x/crypto v0.39.0 golang.org/x/sys v0.33.0 golang.org/x/term v0.32.0 - golang.org/x/text v0.25.0 + golang.org/x/text v0.26.0 ) diff --git a/go.sum b/go.sum index f46e8c676b..6b81fa4744 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= diff --git a/http2/frame.go b/http2/frame.go index 97bd8b06f7..db3264da8c 100644 --- a/http2/frame.go +++ b/http2/frame.go @@ -39,7 +39,7 @@ const ( FrameContinuation FrameType = 0x9 ) -var frameName = map[FrameType]string{ +var frameNames = [...]string{ FrameData: "DATA", FrameHeaders: "HEADERS", FramePriority: "PRIORITY", @@ -53,10 +53,10 @@ var frameName = map[FrameType]string{ } func (t FrameType) String() string { - if s, ok := frameName[t]; ok { - return s + if int(t) < len(frameNames) { + return frameNames[t] } - return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", uint8(t)) + return fmt.Sprintf("UNKNOWN_FRAME_TYPE_%d", t) } // Flags is a bitmask of HTTP/2 flags. @@ -124,7 +124,7 @@ var flagName = map[FrameType]map[Flags]string{ // might be 0). type frameParser func(fc *frameCache, fh FrameHeader, countError func(string), payload []byte) (Frame, error) -var frameParsers = map[FrameType]frameParser{ +var frameParsers = [...]frameParser{ FrameData: parseDataFrame, FrameHeaders: parseHeadersFrame, FramePriority: parsePriorityFrame, @@ -138,8 +138,8 @@ var frameParsers = map[FrameType]frameParser{ } func typeFrameParser(t FrameType) frameParser { - if f := frameParsers[t]; f != nil { - return f + if int(t) < len(frameParsers) { + return frameParsers[t] } return parseUnknownFrame } @@ -509,7 +509,7 @@ func (fr *Framer) ReadFrame() (Frame, error) { } if fh.Length > fr.maxReadSize { if fh == invalidHTTP1LookingFrameHeader() { - return nil, fmt.Errorf("http2: failed reading the frame payload: %w, note that the frame header looked like an HTTP/1.1 header", err) + return nil, fmt.Errorf("http2: failed reading the frame payload: %w, note that the frame header looked like an HTTP/1.1 header", ErrFrameTooLarge) } return nil, ErrFrameTooLarge } diff --git a/http2/frame_test.go b/http2/frame_test.go index 86e5d4f80d..68505317e1 100644 --- a/http2/frame_test.go +++ b/http2/frame_test.go @@ -1258,3 +1258,21 @@ func TestSettingsDuplicates(t *testing.T) { } } + +func TestTypeFrameParser(t *testing.T) { + if len(frameNames) != len(frameParsers) { + t.Errorf("expected len(frameNames)=%d to equal len(frameParsers)=%d", + len(frameNames), len(frameParsers)) + } + + // typeFrameParser() for an unknown type returns a function that returns UnknownFrame + unknownFrameType := FrameType(FrameContinuation + 1) + unknownParser := typeFrameParser(unknownFrameType) + frame, err := unknownParser(nil, FrameHeader{}, nil, nil) + if err != nil { + t.Errorf("unknownParser() must not return an error: %v", err) + } + if _, isUnknown := frame.(*UnknownFrame); !isUnknown { + t.Errorf("expected UnknownFrame, got %T", frame) + } +} diff --git a/internal/http3/http3_synctest_test.go b/internal/http3/http3_synctest_test.go index ad26c6de09..a9c0ac2906 100644 --- a/internal/http3/http3_synctest_test.go +++ b/internal/http3/http3_synctest_test.go @@ -7,6 +7,7 @@ package http3 import ( + "context" "slices" "testing" "testing/synctest" @@ -14,9 +15,16 @@ import ( // runSynctest runs f in a synctest.Run bubble. // It arranges for t.Cleanup functions to run within the bubble. +// TODO: Replace with synctest.Test, which handles all this properly. func runSynctest(t *testing.T, f func(t testing.TB)) { synctest.Run(func() { - ct := &cleanupT{T: t} + // Create a context within the bubble, rather than using t.Context. + ctx, cancel := context.WithCancel(context.Background()) + ct := &cleanupT{ + T: t, + ctx: ctx, + cancel: cancel, + } defer ct.done() f(ct) }) @@ -33,6 +41,8 @@ func runSynctestSubtest(t *testing.T, name string, f func(t testing.TB)) { // Used to execute cleanup functions within a synctest bubble. type cleanupT struct { *testing.T + ctx context.Context + cancel context.CancelFunc cleanups []func() } @@ -41,7 +51,13 @@ func (t *cleanupT) Cleanup(f func()) { t.cleanups = append(t.cleanups, f) } +// Context replaces T.Context. +func (t *cleanupT) Context() context.Context { + return t.ctx +} + func (t *cleanupT) done() { + t.cancel() for _, f := range slices.Backward(t.cleanups) { f() } diff --git a/trace/events.go b/trace/events.go index c646a6952e..3aaffdd1f7 100644 --- a/trace/events.go +++ b/trace/events.go @@ -508,7 +508,7 @@ const eventsHTML = ` {{$el.When}} {{$el.ElapsedTime}} - {{$el.Title}} + {{$el.Title}} {{if $.Expanded}}