MCPcopy
hub / github.com/cli/cli / ForwardPorts

Method ForwardPorts

pkg/cmd/codespace/ports.go:312–353  ·  view source on GitHub ↗
(ctx context.Context, selector *CodespaceSelector, ports []string)

Source from the content-addressed store, hash-verified

310}
311
312func (a *App) ForwardPorts(ctx context.Context, selector *CodespaceSelector, ports []string) (err error) {
313 portPairs, err := getPortPairs(ports)
314 if err != nil {
315 return fmt.Errorf("get port pairs: %w", err)
316 }
317
318 codespace, err := selector.Select(ctx)
319 if err != nil {
320 return err
321 }
322
323 codespaceConnection, err := codespaces.GetCodespaceConnection(ctx, a, a.apiClient, codespace)
324 if err != nil {
325 return fmt.Errorf("error connecting to codespace: %w", err)
326 }
327
328 // Run forwarding of all ports concurrently, aborting all of
329 // them at the first failure, including cancellation of the context.
330 group, ctx := errgroup.WithContext(ctx)
331 for _, pair := range portPairs {
332 group.Go(func() error {
333 listen, _, err := codespaces.ListenTCP(pair.local, true)
334 if err != nil {
335 return err
336 }
337 defer listen.Close()
338
339 a.errLogger.Printf("Forwarding ports: remote %d <=> local %d", pair.remote, pair.local)
340 fwd, err := portforwarder.NewPortForwarder(ctx, codespaceConnection)
341 if err != nil {
342 return fmt.Errorf("failed to create port forwarder: %w", err)
343 }
344 defer safeClose(fwd, &err)
345
346 opts := portforwarder.ForwardPortOpts{
347 Port: pair.remote,
348 }
349 return fwd.ForwardPortToListener(ctx, opts, listen)
350 })
351 }
352 return group.Wait() // first error
353}
354
355type portPair struct {
356 remote, local int

Callers 2

newPortsForwardCmdFunction · 0.80

Calls 11

ForwardPortToListenerMethod · 0.95
GetCodespaceConnectionFunction · 0.92
ListenTCPFunction · 0.92
NewPortForwarderFunction · 0.92
getPortPairsFunction · 0.85
safeCloseFunction · 0.70
ErrorfMethod · 0.65
SelectMethod · 0.65
CloseMethod · 0.65
PrintfMethod · 0.65
WaitMethod · 0.65