mirror of
https://github.com/wweir/sower.git
synced 2024-04-21 12:42:15 +00:00
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package proxy
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/golang/glog"
|
|
"github.com/lucas-clemente/quic-go"
|
|
"github.com/wweir/sower/parser"
|
|
)
|
|
|
|
func StartServer(port string) {
|
|
ln, err := quic.ListenAddr(":"+port, mockTlsPem(), dialConf)
|
|
if err != nil {
|
|
glog.Fatalln(err)
|
|
}
|
|
|
|
for {
|
|
sess, err := ln.Accept()
|
|
if err != nil {
|
|
glog.Errorln(err)
|
|
continue
|
|
}
|
|
go acceptSession(sess)
|
|
}
|
|
}
|
|
|
|
func acceptSession(sess quic.Session) {
|
|
glog.V(1).Infoln("new session from ", sess.RemoteAddr())
|
|
defer sess.Close()
|
|
|
|
for {
|
|
stream, err := sess.AcceptStream()
|
|
if err != nil {
|
|
glog.Errorln(err)
|
|
return
|
|
}
|
|
|
|
go acceptStream(stream, sess)
|
|
}
|
|
}
|
|
|
|
func acceptStream(stream quic.Stream, sess quic.Session) {
|
|
glog.V(1).Infoln("new stream from ", sess.RemoteAddr())
|
|
defer stream.Close()
|
|
|
|
conn, addr, err := parser.ParseAddr(&streamConn{stream, sess})
|
|
if err != nil {
|
|
glog.Warningln(err)
|
|
return
|
|
}
|
|
glog.V(1).Infoln(addr)
|
|
|
|
rc, err := net.Dial("tcp", addr)
|
|
if err != nil {
|
|
glog.Warningln(err)
|
|
return
|
|
}
|
|
defer rc.Close()
|
|
if err := rc.(*net.TCPConn).SetKeepAlive(true); err != nil {
|
|
glog.Warningln(err)
|
|
}
|
|
relay(sess, rc, conn)
|
|
}
|