multiserver/proxy.go

63 lines
986 B
Go

package main
import (
"errors"
"log"
"net"
)
// Proxy processes and forwards packets from src to dst
func Proxy(src, dst *Conn) {
if src == nil {
dst.CloseWith(AccessDeniedServerFail, "", false)
processLeave(dst)
return
} else if dst == nil {
src.Close()
return
}
for {
pkt, err := src.Recv()
if !src.Forward() {
return
} else if !dst.Forward() {
break
}
if err != nil {
if errors.Is(err, net.ErrClosed) {
if err = src.WhyClosed(); err != nil {
log.Print(src.Addr().String(), " disconnected with error: ", err)
} else {
log.Print(src.Addr().String(), " disconnected")
}
if !src.IsSrv() {
connectedConnsMu.Lock()
connectedConns--
connectedConnsMu.Unlock()
processLeave(src)
}
break
}
log.Print(err)
continue
}
// Process
if processPktCommand(src, dst, &pkt) {
continue
}
// Forward
if _, err := dst.Send(pkt); err != nil {
log.Print(err)
}
}
dst.Close()
}