37 lines
911 B
Go
37 lines
911 B
Go
// Copyright (c) Tailscale Inc & contributors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package acme
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
|
|
"tailscale.com/tsweb"
|
|
)
|
|
|
|
// certRateLimitedError is returned when the upstream ACME CA rate-limited
|
|
// the issuance. It exists so cert-fetching failures can surface as HTTP
|
|
// 429 responses via [tsweb.HTTPStatuser].
|
|
type certRateLimitedError struct {
|
|
retryAfter time.Duration
|
|
underlying error
|
|
}
|
|
|
|
func (e certRateLimitedError) Error() string { return e.underlying.Error() }
|
|
func (e certRateLimitedError) Unwrap() error { return e.underlying }
|
|
|
|
// HTTPStatus implements [tsweb.HTTPStatuser].
|
|
func (e certRateLimitedError) HTTPStatus() tsweb.HTTPError {
|
|
h := http.Header{}
|
|
if e.retryAfter > 0 {
|
|
h.Set("Retry-After", strconv.Itoa(int(e.retryAfter.Seconds())))
|
|
}
|
|
return tsweb.HTTPError{
|
|
Code: http.StatusTooManyRequests,
|
|
Msg: e.Error(),
|
|
Header: h,
|
|
}
|
|
}
|