// handle multiplex-ed connection func handleMux(conn io.ReadWriteCloser, target string) { // stream multiplex var mux *yamux.Session config := &yamux.Config{ AcceptBacklog: 256, EnableKeepAlive: true, KeepAliveInterval: 30 * time.Second, ConnectionWriteTimeout: 30 * time.Second, MaxStreamWindowSize: 16777216, LogOutput: os.Stderr, } m, err := yamux.Server(conn, config) if err != nil { log.Println(err) return } mux = m defer mux.Close() for { p1, err := mux.Accept() if err != nil { log.Println(err) return } p2, err := net.DialTimeout("tcp", target, 5*time.Second) if err != nil { log.Println(err) return } go handleClient(p1, p2) } }
func acceptStreams(logger log.Logger, session *yamux.Session, streamCh chan net.Conn) grim.TaskFunc { return func(ctx context.Context) { defer close(streamCh) for { select { case <-ctx.Done(): return default: stream, err := session.Accept() if err != nil { if err != io.EOF { logger.Error("multiplex conn accept failed", "err", err) } return } streamCh <- stream } } } }