func()

in helpers/ssh/stub_ssh_server.go [208:298]


func (s *StubSSHServer) mainLoop(listener net.Listener) {
	defer close(s.stopped)

	var wg sync.WaitGroup
	defer wg.Wait()

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	for {
		if s.closed.Load() {
			return
		}

		if s.DontAcceptConnections {
			time.Sleep(time.Second)
			continue
		}

		conn, err := listener.Accept()
		if errors.Is(err, net.ErrClosed) {
			return
		}
		if errors.Is(err, io.EOF) {
			continue
		}
		if err != nil {
			s.setError(err)
			return
		}

		_, channels, reqs, err := ssh.NewServerConn(conn, s.Config)
		if !s.ExecuteLocal {
			// existing tests rely on us just continuing without serving the SSH request if we're not executing locally
			continue
		}
		if err != nil {
			s.setError(err)
			return
		}

		go ssh.DiscardRequests(reqs)

		go func() {
			for channel := range channels {
				wg.Add(1)

				go func(channel ssh.NewChannel) {
					defer wg.Done()

					var err error

					switch channel.ChannelType() {
					case "session":
						err = s.handleSession(ctx, channel)

					case "direct-tcpip":
						var directTCPIP struct {
							DestAddr  string
							DestPort  uint32
							LocalAddr string
							LocalPort uint32
						}

						err = ssh.Unmarshal(channel.ExtraData(), &directTCPIP)
						if err == nil {
							err = s.handleProxy(ctx, "tcp", channel, net.JoinHostPort(directTCPIP.DestAddr, strconv.FormatInt(int64(directTCPIP.DestPort), 10)))
						}

					case "direct-streamlocal@openssh.com":
						var directStreamLocal struct {
							DestAddr  string
							LocalAddr string
							LocalPort uint32
						}

						err = ssh.Unmarshal(channel.ExtraData(), &directStreamLocal)
						if err == nil {
							err = s.handleProxy(ctx, "unix", channel, directStreamLocal.DestAddr)
						}

					default:
						err = channel.Reject(ssh.UnknownChannelType, fmt.Sprintf("%v: %v", ssh.UnknownChannelType, channel.ChannelType()))
					}

					s.setError(err)
				}(channel)
			}
		}()
	}
}