@@ -4,13 +4,19 @@ import (
44 "context"
55 "crypto/tls"
66 "encoding/hex"
7+ "errors"
78 "fmt"
89 "net"
10+ "sync"
911
12+ "github.com/getlantern/golog"
1013 "github.com/getlantern/tlsmasq"
1114 "github.com/getlantern/tlsmasq/ptlshs"
15+ "github.com/getlantern/tlsutil"
1216)
1317
18+ var log = golog .LoggerFor ("tlsmasq-listener" )
19+
1420func Wrap (ll net.Listener , certFile string , keyFile string , originAddr string , secret string ,
1521 tlsMinVersion uint16 , tlsCipherSuites []uint16 , onNonFatalErrors func (error )) (net.Listener , error ) {
1622
@@ -51,5 +57,45 @@ func Wrap(ll net.Listener, certFile string, keyFile string, originAddr string, s
5157 },
5258 }
5359
54- return tlsmasq .WrapListener (ll , listenerCfg ), nil
60+ return wrapListener (ll , listenerCfg ), nil
61+ }
62+
63+ type loggingListener struct {
64+ tlsmasqListener net.Listener
65+ }
66+
67+ func wrapListener (transportListener net.Listener , cfg tlsmasq.ListenerConfig ) net.Listener {
68+ return loggingListener {tlsmasq .WrapListener (transportListener , cfg )}
69+ }
70+
71+ func (l loggingListener ) Accept () (net.Conn , error ) {
72+ conn , err := l .tlsmasqListener .Accept ()
73+ if err != nil {
74+ return nil , err
75+ }
76+ return loggingConn {Conn : conn .(tlsmasq.Conn )}, nil
77+ }
78+
79+ func (l loggingListener ) Addr () net.Addr { return l .tlsmasqListener .Addr () }
80+ func (l loggingListener ) Close () error { return l .tlsmasqListener .Close () }
81+
82+ type loggingConn struct {
83+ tlsmasq.Conn
84+ handshakeOnce sync.Once
85+ }
86+
87+ func (conn loggingConn ) Read (b []byte ) (n int , err error ) { return conn .doIO (b , conn .Conn .Read ) }
88+ func (conn loggingConn ) Write (b []byte ) (n int , err error ) { return conn .doIO (b , conn .Conn .Write ) }
89+
90+ func (conn loggingConn ) doIO (b []byte , io func ([]byte ) (int , error )) (n int , err error ) {
91+ conn .handshakeOnce .Do (func () {
92+ var alertErr tlsutil.UnexpectedAlertError
93+ if err = conn .Handshake (); err != nil && errors .As (err , & alertErr ) {
94+ log .Debugf ("received alert from origin in tlsmasq handshake: %v" , alertErr .Alert )
95+ }
96+ })
97+ if err != nil {
98+ return 0 , err
99+ }
100+ return io (b )
55101}
0 commit comments