|
|
|
|
@ -2,6 +2,7 @@ package proxy
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"bufio" |
|
|
|
|
"crypto/tls" |
|
|
|
|
"encoding/json" |
|
|
|
|
"errors" |
|
|
|
|
"io" |
|
|
|
|
@ -17,14 +18,26 @@ const (
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func (s *ProxyServer) ListenTCP() { |
|
|
|
|
timeout := util.MustParseDuration(s.config.Proxy.Stratum.Timeout) |
|
|
|
|
s.timeout = timeout |
|
|
|
|
|
|
|
|
|
addr, err := net.ResolveTCPAddr("tcp4", s.config.Proxy.Stratum.Listen) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalf("Error: %v", err) |
|
|
|
|
s.timeout = util.MustParseDuration(s.config.Proxy.Stratum.Timeout) |
|
|
|
|
|
|
|
|
|
var err error |
|
|
|
|
var server net.Listener |
|
|
|
|
setKeepAlive := func(net.Conn) {} |
|
|
|
|
if s.config.Proxy.Stratum.TLS { |
|
|
|
|
var cert tls.Certificate |
|
|
|
|
cert, err = tls.LoadX509KeyPair(s.config.Proxy.Stratum.CertFile, s.config.Proxy.Stratum.KeyFile) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalln("Error loading certificate:", err) |
|
|
|
|
} |
|
|
|
|
tlsCfg := &tls.Config{Certificates: []tls.Certificate{cert}} |
|
|
|
|
server, err = tls.Listen("tcp4", s.config.Proxy.Stratum.Listen, tlsCfg) |
|
|
|
|
} else { |
|
|
|
|
server, err = net.Listen("tcp4", s.config.Proxy.Stratum.Listen) |
|
|
|
|
setKeepAlive = func(conn net.Conn) { |
|
|
|
|
conn.(*net.TCPConn).SetKeepAlive(true) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
server, err := net.ListenTCP("tcp4", addr) |
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatalf("Error: %v", err) |
|
|
|
|
} |
|
|
|
|
@ -35,11 +48,11 @@ func (s *ProxyServer) ListenTCP() {
|
|
|
|
|
n := 0 |
|
|
|
|
|
|
|
|
|
for { |
|
|
|
|
conn, err := server.AcceptTCP() |
|
|
|
|
conn, err := server.Accept() |
|
|
|
|
if err != nil { |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
conn.SetKeepAlive(true) |
|
|
|
|
setKeepAlive(conn) |
|
|
|
|
|
|
|
|
|
ip, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) |
|
|
|
|
|
|
|
|
|
@ -168,7 +181,7 @@ func (cs *Session) sendTCPError(id json.RawMessage, reply *ErrorReply) error {
|
|
|
|
|
return errors.New(reply.Message) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *ProxyServer) setDeadline(conn *net.TCPConn) { |
|
|
|
|
func (self *ProxyServer) setDeadline(conn net.Conn) { |
|
|
|
|
conn.SetDeadline(time.Now().Add(self.timeout)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|