chore: add SetupContextForConn for common/net
This commit is contained in:
parent
885ee7a820
commit
ee3038d5e4
1 changed files with 31 additions and 0 deletions
31
common/net/context.go
Normal file
31
common/net/context.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package net
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SetupContextForConn is a helper function that starts connection I/O interrupter goroutine.
|
||||||
|
func SetupContextForConn(ctx context.Context, conn net.Conn) (done func(*error)) {
|
||||||
|
var (
|
||||||
|
quit = make(chan struct{})
|
||||||
|
interrupt = make(chan error, 1)
|
||||||
|
)
|
||||||
|
go func() {
|
||||||
|
select {
|
||||||
|
case <-quit:
|
||||||
|
interrupt <- nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
// Close the connection, discarding the error
|
||||||
|
_ = conn.Close()
|
||||||
|
interrupt <- ctx.Err()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return func(inputErr *error) {
|
||||||
|
close(quit)
|
||||||
|
if ctxErr := <-interrupt; ctxErr != nil && inputErr != nil {
|
||||||
|
// Return context error to user.
|
||||||
|
inputErr = &ctxErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue