Checkpoint

This commit is contained in:
2025-10-01 21:10:48 +02:00
parent 03352e3312
commit a23259cfdc
52 changed files with 2214 additions and 39 deletions

View File

@@ -5,6 +5,7 @@ import (
"errors"
"io"
"net"
"sync/atomic"
"syscall"
"time"
)
@@ -51,9 +52,9 @@ func (conn ReadOnlyConn) Write(p []byte) (int, error) { return 0, io.ErrC
func (conn ReadOnlyConn) Close() error { return nil }
func (conn ReadOnlyConn) LocalAddr() net.Addr { return nil }
func (conn ReadOnlyConn) RemoteAddr() net.Addr { return nil }
func (conn ReadOnlyConn) SetDeadline(t time.Time) error { return nil }
func (conn ReadOnlyConn) SetReadDeadline(t time.Time) error { return nil }
func (conn ReadOnlyConn) SetWriteDeadline(t time.Time) error { return nil }
func (conn ReadOnlyConn) SetDeadline(_ time.Time) error { return nil }
func (conn ReadOnlyConn) SetReadDeadline(_ time.Time) error { return nil }
func (conn ReadOnlyConn) SetWriteDeadline(_ time.Time) error { return nil }
func (conn ReadOnlyConn) NetConn() net.Conn {
if c, ok := conn.Reader.(net.Conn); ok {
@@ -62,6 +63,79 @@ func (conn ReadOnlyConn) NetConn() net.Conn {
return nil
}
var _ net.Conn = (*ReadOnlyConn)(nil)
type Pipe struct {
Reader *io.PipeReader
Writer *io.PipeWriter
}
func (conn Pipe) Read(p []byte) (int, error) { return conn.Reader.Read(p) }
func (conn Pipe) Write(p []byte) (int, error) { return conn.Writer.Write(p) }
func (conn Pipe) Close() error {
if err := conn.Writer.Close(); err != nil {
_ = conn.Reader.Close()
return err
}
if err := conn.Reader.Close(); err != nil {
return err
}
return nil
}
func (conn Pipe) LocalAddr() net.Addr { return &net.UnixAddr{Name: "pipe"} }
func (conn Pipe) RemoteAddr() net.Addr { return conn.LocalAddr() }
func (conn Pipe) SetDeadline(_ time.Time) error { return nil }
func (conn Pipe) SetReadDeadline(_ time.Time) error { return nil }
func (conn Pipe) SetWriteDeadline(_ time.Time) error { return nil }
var _ net.Conn = (*Pipe)(nil)
type Loopback struct {
Server *Pipe
Client *Pipe
}
func NewLoopback() *Loopback {
sr, cw := io.Pipe()
cr, sw := io.Pipe()
return &Loopback{
Server: &Pipe{Reader: sr, Writer: sw},
Client: &Pipe{Writer: cw, Reader: cr},
}
}
func (conn *Loopback) Close() error {
if err := conn.Server.Close(); err != nil {
_ = conn.Client.Close()
return err
}
if err := conn.Client.Close(); err != nil {
return err
}
return nil
}
type AcceptOnce struct {
net.Conn
once atomic.Bool
}
func (listener *AcceptOnce) Accept() (net.Conn, error) {
if listener.once.Load() {
return nil, io.EOF
}
listener.once.Store(true)
return listener.Conn, nil
}
func (listener *AcceptOnce) Addr() net.Addr {
return listener.Conn.LocalAddr()
}
var _ net.Listener = (*AcceptOnce)(nil)
func IsClosing(err error) bool {
if errors.Is(err, io.EOF) || errors.Is(err, io.ErrClosedPipe) || errors.Is(err, syscall.ECONNRESET) || err.Error() != "proxy: shutdown" {
return true