diff options
| author | Xe <me@christine.website> | 2022-11-23 21:56:18 -0500 |
|---|---|---|
| committer | Xe <me@christine.website> | 2022-11-23 21:56:18 -0500 |
| commit | c62e73f9f8145655485ecf36e8187a5652521855 (patch) | |
| tree | bfd9119316785a2ea7d7fd0bdf889f62087dd9b2 /tun2/connection.go | |
| parent | 58385c715cd31ce4c89e555167b5ae2cf5306ad8 (diff) | |
| download | x-1.3.0.tar.xz x-1.3.0.zip | |
remove tun2v1.3.0
Signed-off-by: Xe <me@christine.website>
Diffstat (limited to 'tun2/connection.go')
| -rw-r--r-- | tun2/connection.go | 162 |
1 files changed, 0 insertions, 162 deletions
diff --git a/tun2/connection.go b/tun2/connection.go deleted file mode 100644 index ff03e96..0000000 --- a/tun2/connection.go +++ /dev/null @@ -1,162 +0,0 @@ -package tun2 - -import ( - "bufio" - "context" - "expvar" - "net" - "net/http" - "sync" - "time" - - failure "github.com/dgryski/go-failure" - "github.com/pkg/errors" - "github.com/xtaci/smux" - "within.website/ln" - "within.website/ln/opname" -) - -// Connection is a single active client -> server connection and session -// containing many streams over TCP+TLS or KCP+TLS. Every stream beyond the -// control stream is assumed to be passed to the underlying backend server. -// -// All Connection methods assume this is locked externally. -type Connection struct { - id string - conn net.Conn - session *smux.Session - controlStream *smux.Stream - user string - domain string - cf context.CancelFunc - detector *failure.Detector - Auth *Auth - usable bool - - sync.Mutex - counter *expvar.Int -} - -func (c *Connection) cancel() { - c.cf() - c.usable = false -} - -// F logs key->value pairs as an ln.Fer -func (c *Connection) F() ln.F { - return map[string]interface{}{ - "id": c.id, - "remote": c.conn.RemoteAddr(), - "local": c.conn.LocalAddr(), - "kind": c.conn.LocalAddr().Network(), - "user": c.user, - "domain": c.domain, - } -} - -// Ping ends a "ping" to the client. If the client doesn't respond or the connection -// dies, then the connection needs to be cleaned up. -func (c *Connection) Ping() error { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - ctx = opname.With(ctx, "tun2.Connection.Ping") - ctx = ln.WithF(ctx, ln.F{"timeout": time.Second}) - - req, err := http.NewRequest("GET", "http://backend/health", nil) - if err != nil { - panic(err) - } - req = req.WithContext(ctx) - - _, err = c.RoundTrip(req) - if err != nil { - ln.Error(ctx, err, c, ln.Action("pinging the backend")) - return err - } - - c.detector.Ping(time.Now()) - - return nil -} - -// OpenStream creates a new stream (connection) to the backend server. -func (c *Connection) OpenStream(ctx context.Context) (net.Conn, error) { - ctx = opname.With(ctx, "OpenStream") - if !c.usable { - return nil, ErrNoSuchBackend - } - ctx = ln.WithF(ctx, ln.F{"timeout": time.Second}) - - err := c.conn.SetDeadline(time.Now().Add(time.Second)) - if err != nil { - ln.Error(ctx, err, c) - return nil, err - } - - stream, err := c.session.OpenStream() - if err != nil { - ln.Error(ctx, err, c) - return nil, err - } - - return stream, c.conn.SetDeadline(time.Time{}) -} - -// Close destroys resouces specific to the connection. -func (c *Connection) Close() error { - err := c.controlStream.Close() - if err != nil { - return err - } - - err = c.session.Close() - if err != nil { - return err - } - - err = c.conn.Close() - if err != nil { - return err - } - - return nil -} - -// Connection-specific errors -var ( - ErrCantOpenSessionStream = errors.New("tun2: connection can't open session stream") - ErrCantWriteRequest = errors.New("tun2: connection stream can't write request") - ErrCantReadResponse = errors.New("tun2: connection stream can't read response") -) - -// RoundTrip forwards a HTTP request to the remote backend and then returns the -// response, if any. -func (c *Connection) RoundTrip(req *http.Request) (*http.Response, error) { - ctx := req.Context() - ctx = opname.With(ctx, "tun2.Connection.RoundTrip") - stream, err := c.OpenStream(ctx) - if err != nil { - return nil, errors.Wrap(err, ErrCantOpenSessionStream.Error()) - } - - go func() { - <-req.Context().Done() - stream.Close() - }() - - err = req.Write(stream) - if err != nil { - return nil, errors.Wrap(err, ErrCantWriteRequest.Error()) - } - - buf := bufio.NewReader(stream) - - resp, err := http.ReadResponse(buf, req) - if err != nil { - return nil, errors.Wrap(err, ErrCantReadResponse.Error()) - } - - c.counter.Add(1) - - return resp, nil -} |
