mirror of
https://github.com/tinygo-org/net.git
synced 2026-08-18 19:43:57 +00:00
BUG Fix: return proper net.OpError's for Read/Write operations
Need to return the same error structure/content as regular Go for net.Conn Read/Write operations. Found/fixed when testing deadlines on Read/Write operations.
This commit is contained in:
committed by
deadprogram
parent
ad745d61ae
commit
7898c5e946
+12
-26
@@ -9,6 +9,7 @@ package net
|
||||
import (
|
||||
"fmt"
|
||||
"internal/itoa"
|
||||
"io"
|
||||
"net/netip"
|
||||
"strconv"
|
||||
"syscall"
|
||||
@@ -116,6 +117,7 @@ func ResolveTCPAddr(network, address string) (*TCPAddr, error) {
|
||||
// connections.
|
||||
type TCPConn struct {
|
||||
fd int
|
||||
net string
|
||||
laddr *TCPAddr
|
||||
raddr *TCPAddr
|
||||
readDeadline time.Time
|
||||
@@ -159,6 +161,7 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) {
|
||||
|
||||
return &TCPConn{
|
||||
fd: fd,
|
||||
net: network,
|
||||
laddr: laddr,
|
||||
raddr: raddr,
|
||||
}, nil
|
||||
@@ -167,44 +170,26 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) {
|
||||
// TINYGO: Use netdev for Conn methods: Read = Recv, Write = Send, etc.
|
||||
|
||||
func (c *TCPConn) Read(b []byte) (int, error) {
|
||||
var timeout time.Duration
|
||||
|
||||
now := time.Now()
|
||||
|
||||
if !c.readDeadline.IsZero() {
|
||||
if c.readDeadline.Before(now) {
|
||||
return 0, fmt.Errorf("Read deadline expired")
|
||||
} else {
|
||||
timeout = c.readDeadline.Sub(now)
|
||||
}
|
||||
}
|
||||
|
||||
n, err := netdev.Recv(c.fd, b, 0, timeout)
|
||||
n, err := netdev.Recv(c.fd, b, 0, c.readDeadline)
|
||||
// Turn the -1 socket error into 0 and let err speak for error
|
||||
if n < 0 {
|
||||
n = 0
|
||||
}
|
||||
if err != nil && err != io.EOF {
|
||||
err = &OpError{Op: "read", Net: c.net, Source: c.laddr, Addr: c.raddr, Err: err}
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func (c *TCPConn) Write(b []byte) (int, error) {
|
||||
var timeout time.Duration
|
||||
|
||||
now := time.Now()
|
||||
|
||||
if !c.writeDeadline.IsZero() {
|
||||
if c.writeDeadline.Before(now) {
|
||||
return 0, fmt.Errorf("Write deadline expired")
|
||||
} else {
|
||||
timeout = c.writeDeadline.Sub(now)
|
||||
}
|
||||
}
|
||||
|
||||
n, err := netdev.Send(c.fd, b, 0, timeout)
|
||||
n, err := netdev.Send(c.fd, b, 0, c.writeDeadline)
|
||||
// Turn the -1 socket error into 0 and let err speak for error
|
||||
if n < 0 {
|
||||
n = 0
|
||||
}
|
||||
if err != nil {
|
||||
err = &OpError{Op: "write", Net: c.net, Source: c.laddr, Addr: c.raddr, Err: err}
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
@@ -262,6 +247,7 @@ func (l *listener) Accept() (Conn, error) {
|
||||
|
||||
return &TCPConn{
|
||||
fd: fd,
|
||||
net: "tcp",
|
||||
laddr: l.laddr,
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user