package main import ( "context" "fmt" "net/http" "time" ) func waitForWireGuard(ctx context.Context, endpoint string, timeout time.Duration) error { ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() transport := &http.Transport{} defer transport.CloseIdleConnections() client := &http.Client{ Transport: transport, Timeout: 5 * time.Second, CheckRedirect: func(_ *http.Request, _ []*http.Request) error { return http.ErrUseLastResponse }, } ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { if err := probeWireGuard(ctx, client, endpoint); err == nil { return nil } else { select { case <-ctx.Done(): return fmt.Errorf("%w: %v", ctx.Err(), err) case <-ticker.C: } } } } func probeWireGuard(ctx context.Context, client *http.Client, endpoint string) error { request, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) if err != nil { return err } response, err := client.Do(request) if err != nil { return err } defer func() { _ = response.Body.Close() }() // The relay proxy fetches this response live from the OCI WireGuard address. if response.StatusCode != http.StatusOK { return fmt.Errorf("WireGuard endpoint returned HTTP %d", response.StatusCode) } return nil }