37 lines
1.0 KiB
Go
37 lines
1.0 KiB
Go
package checkrunner
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// HTTPS performs a GET against target (expected to be a full URL, e.g.
|
|
// https://github.com) and reports success for any response with status
|
|
// < 400. It never follows the check to a different host on a check-type
|
|
// boundary — redirects within the same request are followed by the
|
|
// standard http.Client default policy, which is what we want for
|
|
// reachability checks.
|
|
func HTTPS(target string, timeout time.Duration) func(ctx context.Context) Result {
|
|
return run("https", target, func(ctx context.Context) error {
|
|
ctx, cancel := context.WithTimeout(ctx, timeout)
|
|
defer cancel()
|
|
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, target, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("build request: %w", err)
|
|
}
|
|
client := &http.Client{Timeout: timeout}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode >= 400 {
|
|
return fmt.Errorf("unexpected status %d", resp.StatusCode)
|
|
}
|
|
return nil
|
|
})
|
|
}
|