(ctx, hardCtx context.Context, l net.Listener)
| 63 | } |
| 64 | |
| 65 | func (s *Server) Serve(ctx, hardCtx context.Context, l net.Listener) (retErr error) { |
| 66 | var wg sync.WaitGroup |
| 67 | for { |
| 68 | if ctx.Err() != nil { |
| 69 | break |
| 70 | } |
| 71 | conn, err := l.Accept() |
| 72 | if err != nil { |
| 73 | s.logger.Debug(ctx, "accept pty failed", slog.Error(err)) |
| 74 | retErr = err |
| 75 | break |
| 76 | } |
| 77 | clog := s.logger.With( |
| 78 | slog.F("remote", conn.RemoteAddr()), |
| 79 | slog.F("local", conn.LocalAddr())) |
| 80 | clog.Info(ctx, "accepted conn") |
| 81 | |
| 82 | // It's not safe to assume RemoteAddr() returns a non-nil value. slog.F usage is fine because it correctly |
| 83 | // handles nil. |
| 84 | // c.f. https://github.com/coder/internal/issues/1143 |
| 85 | remoteAddr := conn.RemoteAddr() |
| 86 | remoteAddrString := "" |
| 87 | if remoteAddr != nil { |
| 88 | remoteAddrString = remoteAddr.String() |
| 89 | } |
| 90 | |
| 91 | wg.Add(1) |
| 92 | disconnected := s.reportConnection(uuid.New(), remoteAddrString) |
| 93 | closed := make(chan struct{}) |
| 94 | go func() { |
| 95 | defer wg.Done() |
| 96 | select { |
| 97 | case <-closed: |
| 98 | case <-hardCtx.Done(): |
| 99 | clog.Info(hardCtx, "reconnecting pty closed", |
| 100 | codersdk.ConnectionDirectionAgentToClient.SlogField(), |
| 101 | codersdk.DisconnectReasonServerShutdown.SlogField(), |
| 102 | codersdk.DisconnectReasonServerShutdown.SlogExpectedField(), |
| 103 | ) |
| 104 | disconnected(1, "server shut down") |
| 105 | _ = conn.Close() |
| 106 | } |
| 107 | }() |
| 108 | wg.Add(1) |
| 109 | go func() { |
| 110 | defer close(closed) |
| 111 | defer wg.Done() |
| 112 | err := s.handleConn(ctx, clog, conn) |
| 113 | var reason codersdk.DisconnectReason |
| 114 | var code int |
| 115 | var detail string |
| 116 | switch { |
| 117 | case err != nil && ctx.Err() != nil: |
| 118 | reason = codersdk.DisconnectReasonServerShutdown |
| 119 | code = 1 |
| 120 | case err != nil: |
| 121 | reason = codersdk.DisconnectReasonNetworkError |
| 122 | detail = err.Error() |
nothing calls this directly
no test coverage detected