mirror of
https://github.com/tinygo-org/net.git
synced 2026-08-18 11:33:56 +00:00
Upgrade net package from Go 1.21.4 to Go 1.26.2
Backport upstream Go standard library changes to TinyGo's net package. Unmodified files (18) replaced directly from Go 1.26.2 source. Modified files (22) merged via 3-way diff, preserving all TinyGo netdev adaptations, TINYGO markers, and embedded-device constraints. Notable upstream changes included: - net/http: cookie handling improvements, fs enhancements, reverse proxy updates, chunked encoding fixes - net/http: ServeMux routing and pattern matching updates - net: IP parsing and MAC address handling improvements - Various doc link syntax modernization (e.g. [Dial], [Buffers]) TinyGo-only files (netdev.go, tlssock.go) unchanged. All TINYGO comment markers preserved.
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
// TINYGO: The following is copied from Go 1.21.4 official implementation.
|
||||
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// TINYGO: The following is copied from Go 1.26.2 official implementation.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
@@ -155,6 +153,7 @@ func TestParseHexUint(t *testing.T) {
|
||||
{"00000000000000000", 0, "http chunk length too large"}, // could accept if we wanted
|
||||
{"10000000000000000", 0, "http chunk length too large"},
|
||||
{"00000000000000001", 0, "http chunk length too large"}, // could accept if we wanted
|
||||
{"", 0, "empty hex number for chunk length"},
|
||||
}
|
||||
for i := uint64(0); i <= 1234; i++ {
|
||||
tests = append(tests, testCase{in: fmt.Sprintf("%x", i), want: i})
|
||||
@@ -241,3 +240,89 @@ func TestChunkEndReadError(t *testing.T) {
|
||||
t.Errorf("expected %v, got %v", readErr, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestChunkReaderTooMuchOverhead(t *testing.T) {
|
||||
// If the sender is sending 100x as many chunk header bytes as chunk data,
|
||||
// we should reject the stream at some point.
|
||||
chunk := []byte("1;")
|
||||
for i := 0; i < 100; i++ {
|
||||
chunk = append(chunk, 'a') // chunk extension
|
||||
}
|
||||
chunk = append(chunk, "\r\nX\r\n"...)
|
||||
const bodylen = 1 << 20
|
||||
r := NewChunkedReader(&funcReader{f: func(i int) ([]byte, error) {
|
||||
if i < bodylen {
|
||||
return chunk, nil
|
||||
}
|
||||
return []byte("0\r\n"), nil
|
||||
}})
|
||||
_, err := io.ReadAll(r)
|
||||
if err == nil {
|
||||
t.Fatalf("successfully read body with excessive overhead; want error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestChunkReaderByteAtATime(t *testing.T) {
|
||||
// Sending one byte per chunk should not trip the excess-overhead detection.
|
||||
const bodylen = 1 << 20
|
||||
r := NewChunkedReader(&funcReader{f: func(i int) ([]byte, error) {
|
||||
if i < bodylen {
|
||||
return []byte("1\r\nX\r\n"), nil
|
||||
}
|
||||
return []byte("0\r\n"), nil
|
||||
}})
|
||||
got, err := io.ReadAll(r)
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
if len(got) != bodylen {
|
||||
t.Errorf("read %v bytes, want %v", len(got), bodylen)
|
||||
}
|
||||
}
|
||||
|
||||
func TestChunkInvalidInputs(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
b string
|
||||
}{{
|
||||
name: "bare LF in chunk size",
|
||||
b: "1\na\r\n0\r\n",
|
||||
}, {
|
||||
name: "extra LF in chunk size",
|
||||
b: "1\r\r\na\r\n0\r\n",
|
||||
}, {
|
||||
name: "bare LF in chunk data",
|
||||
b: "1\r\na\n0\r\n",
|
||||
}, {
|
||||
name: "bare LF in chunk extension",
|
||||
b: "1;\na\r\n0\r\n",
|
||||
}} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
r := NewChunkedReader(strings.NewReader(test.b))
|
||||
got, err := io.ReadAll(r)
|
||||
if err == nil {
|
||||
t.Fatalf("unexpectedly parsed invalid chunked data:\n%q", got)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type funcReader struct {
|
||||
f func(iteration int) ([]byte, error)
|
||||
i int
|
||||
b []byte
|
||||
err error
|
||||
}
|
||||
|
||||
func (r *funcReader) Read(p []byte) (n int, err error) {
|
||||
if len(r.b) == 0 && r.err == nil {
|
||||
r.b, r.err = r.f(r.i)
|
||||
r.i++
|
||||
}
|
||||
n = copy(p, r.b)
|
||||
r.b = r.b[n:]
|
||||
if len(r.b) > 0 {
|
||||
return n, nil
|
||||
}
|
||||
return n, r.err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user