5
5
"errors"
6
6
"fmt"
7
7
"io"
8
+ "math/rand"
8
9
"net"
9
10
"net/http"
10
11
"slices"
@@ -23,8 +24,33 @@ type HTTPClient interface {
23
24
Do (req * http.Request ) (* http.Response , error )
24
25
}
25
26
26
- var resolver dns.Resolver = dns.RootResolver {}
27
- var httpClient HTTPClient = http .DefaultClient
27
+ var (
28
+ resolver dns.Resolver = dns.RootResolver {}
29
+ httpClient HTTPClient = & http.Client {
30
+ // Based on the default transport: https://pkg.go.dev/net/http#RoundTripper
31
+ Transport : & http.Transport {
32
+ Proxy : http .ProxyFromEnvironment ,
33
+ DialContext : func (ctx context.Context , network , addr string ) (net.Conn , error ) {
34
+ host , port , err := net .SplitHostPort (addr )
35
+ if err != nil {
36
+ return nil , err
37
+ }
38
+ ips , err := resolver .LookupIPAddr (ctx , host )
39
+ if err != nil {
40
+ return nil , err
41
+ }
42
+ dialer := & net.Dialer {}
43
+ rootAddr := net .JoinHostPort (ips [rand .Intn (len (ips ))].String (), port )
44
+ return dialer .DialContext (ctx , network , rootAddr )
45
+ },
46
+ ForceAttemptHTTP2 : true ,
47
+ MaxIdleConns : 100 ,
48
+ IdleConnTimeout : 90 * time .Second ,
49
+ TLSHandshakeTimeout : 10 * time .Second ,
50
+ ExpectContinueTimeout : 1 * time .Second ,
51
+ },
52
+ }
53
+ )
28
54
29
55
func GenerateLetsEncryptCert (ctx context.Context , client cliClient.Client ) error {
30
56
projectName , err := client .LoadProjectName (ctx )
@@ -252,7 +278,17 @@ func checkDomainDNSReady(ctx context.Context, domain string, validCNAMEs []strin
252
278
}
253
279
254
280
func checkTLSCert (ctx context.Context , domain string ) error {
255
- return getWithRetries (ctx , fmt .Sprintf ("https://%v" , domain ), 3 )
281
+ url := fmt .Sprintf ("https://%v" , domain )
282
+ req , err := http .NewRequestWithContext (ctx , http .MethodGet , url , nil )
283
+ if err != nil {
284
+ return err
285
+ }
286
+ resp , err := httpClient .Do (req ) // http non 200 errors are not considered as errors
287
+ if err != nil {
288
+ return err
289
+ }
290
+ defer resp .Body .Close ()
291
+ return nil
256
292
}
257
293
258
294
func getWithRetries (ctx context.Context , url string , tries int ) error {
@@ -267,7 +303,6 @@ func getWithRetries(ctx context.Context, url string, tries int) error {
267
303
defer resp .Body .Close ()
268
304
var msg []byte
269
305
msg , err = io .ReadAll (resp .Body )
270
- term .Debugf ("Response from %v: %v" , url , string (msg ))
271
306
if resp .StatusCode == http .StatusOK {
272
307
return nil
273
308
}
0 commit comments