quorate/services/oci-l4-relay-wan-controller/recovery.go

52 lines
1.3 KiB
Go

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
}