MCPcopy Index your code
hub / github.com/coder/coder / Serve

Method Serve

agent/reconnectingpty/server.go:65–139  ·  view source on GitHub ↗
(ctx, hardCtx context.Context, l net.Listener)

Source from the content-addressed store, hash-verified

63}
64
65func (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()

Callers

nothing calls this directly

Calls 15

SlogFieldMethod · 0.95
SlogExpectedFieldMethod · 0.95
handleConnMethod · 0.95
SlogDisconnectDetailFunction · 0.92
ErrMethod · 0.80
reportConnectionMethod · 0.80
AddMethod · 0.65
NewMethod · 0.65
CloseMethod · 0.65
WaitMethod · 0.65
AcceptMethod · 0.45
ErrorMethod · 0.45

Tested by

no test coverage detected