mirror of
https://github.com/tinygo-org/net.git
synced 2026-07-26 08:18:39 +00:00
35e809e0e5
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.
132 lines
3.9 KiB
Go
132 lines
3.9 KiB
Go
// TINYGO: The following is copied and modified from Go 1.26.2 official implementation.
|
|
|
|
// Copyright 2010 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
import (
|
|
"errors"
|
|
"net/netip"
|
|
"syscall"
|
|
)
|
|
|
|
// BUG(mikio): On every POSIX platform, reads from the "ip4" network
|
|
// using the ReadFrom or ReadFromIP method might not return a complete
|
|
// IPv4 packet, including its header, even if there is space
|
|
// available. This can occur even in cases where Read or ReadMsgIP
|
|
// could return a complete packet. For this reason, it is recommended
|
|
// that you do not use these methods if it is important to receive a
|
|
// full packet.
|
|
//
|
|
// The Go 1 compatibility guidelines make it impossible for us to
|
|
// change the behavior of these methods; use Read or ReadMsgIP
|
|
// instead.
|
|
|
|
// BUG(mikio): On JS and Plan 9, methods and functions related
|
|
// to IPConn are not implemented.
|
|
|
|
// BUG: On Windows, raw IP sockets are restricted by the operating system.
|
|
// Sending TCP data, sending UDP data with invalid source addresses,
|
|
// and calling bind with TCP protocol don't work.
|
|
//
|
|
// See Winsock reference for details.
|
|
|
|
func ipAddrFromAddr(addr netip.Addr) *IPAddr {
|
|
return &IPAddr{
|
|
IP: addr.AsSlice(),
|
|
Zone: addr.Zone(),
|
|
}
|
|
}
|
|
|
|
// IPAddr represents the address of an IP end point.
|
|
type IPAddr struct {
|
|
IP IP
|
|
Zone string // IPv6 scoped addressing zone
|
|
}
|
|
|
|
// Network returns the address's network name, "ip".
|
|
func (a *IPAddr) Network() string { return "ip" }
|
|
|
|
func (a *IPAddr) String() string {
|
|
if a == nil {
|
|
return "<nil>"
|
|
}
|
|
ip := ipEmptyString(a.IP)
|
|
if a.Zone != "" {
|
|
return ip + "%" + a.Zone
|
|
}
|
|
return ip
|
|
}
|
|
|
|
func (a *IPAddr) isWildcard() bool {
|
|
if a == nil || a.IP == nil {
|
|
return true
|
|
}
|
|
return a.IP.IsUnspecified()
|
|
}
|
|
|
|
func (a *IPAddr) opAddr() Addr {
|
|
if a == nil {
|
|
return nil
|
|
}
|
|
return a
|
|
}
|
|
|
|
// ResolveIPAddr returns an address of IP end point.
|
|
//
|
|
// The network must be an IP network name.
|
|
//
|
|
// If the host in the address parameter is not a literal IP address,
|
|
// ResolveIPAddr resolves the address to an address of IP end point.
|
|
// Otherwise, it parses the address as a literal IP address.
|
|
// The address parameter can use a host name, but this is not
|
|
// recommended, because it will return at most one of the host name's
|
|
// IP addresses.
|
|
//
|
|
// See func [Dial] for a description of the network and address
|
|
// parameters.
|
|
func ResolveIPAddr(network, address string) (*IPAddr, error) {
|
|
return nil, errors.New("ResolveIPAddr not implemented")
|
|
}
|
|
|
|
// IPConn is the implementation of the [Conn] and [PacketConn] interfaces
|
|
// for IP network connections.
|
|
type IPConn struct {
|
|
conn
|
|
}
|
|
|
|
// SyscallConn returns a raw network connection.
|
|
// This implements the [syscall.Conn] interface.
|
|
func (c *IPConn) SyscallConn() (syscall.RawConn, error) {
|
|
return nil, errors.New("SyscallConn not implemented")
|
|
}
|
|
|
|
// ReadMsgIP reads a message from c, copying the payload into b and
|
|
// the associated out-of-band data into oob. It returns the number of
|
|
// bytes copied into b, the number of bytes copied into oob, the flags
|
|
// that were set on the message and the source address of the message.
|
|
//
|
|
// The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be
|
|
// used to manipulate IP-level socket options in oob.
|
|
func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err error) {
|
|
err = errors.New("ReadMsgIP not implemented")
|
|
return
|
|
}
|
|
|
|
// ReadFrom implements the PacketConn ReadFrom method.
|
|
func (c *IPConn) ReadFrom(b []byte) (int, Addr, error) {
|
|
return 0, nil, errors.New("ReadFrom not implemented")
|
|
}
|
|
|
|
// WriteToIP acts like WriteTo but takes an IPAddr.
|
|
func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
|
|
return 0, errors.New("WriteToIP not implemented")
|
|
}
|
|
|
|
// WriteTo implements the [PacketConn] WriteTo method.
|
|
func (c *IPConn) WriteTo(b []byte, addr Addr) (int, error) {
|
|
return 0, errors.New("WriteTo not implemented")
|
|
}
|