Checkpoint
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user