makeClient creates an ACME client which will use a custom resolver instead of net.DefaultResolver.
()
| 305 | // makeClient creates an ACME client which will use a custom |
| 306 | // resolver instead of net.DefaultResolver. |
| 307 | func (ash Handler) makeClient() (acme.Client, error) { |
| 308 | // If no local resolvers are configured, check for global resolvers from TLS app |
| 309 | resolversToUse := ash.Resolvers |
| 310 | if len(resolversToUse) == 0 { |
| 311 | tlsAppIface, err := ash.ctx.App("tls") |
| 312 | if err == nil { |
| 313 | tlsApp := tlsAppIface.(*caddytls.TLS) |
| 314 | if len(tlsApp.Resolvers) > 0 { |
| 315 | resolversToUse = tlsApp.Resolvers |
| 316 | } |
| 317 | } |
| 318 | } |
| 319 | |
| 320 | for _, v := range resolversToUse { |
| 321 | addr, err := caddy.ParseNetworkAddressWithDefaults(v, "udp", 53) |
| 322 | if err != nil { |
| 323 | return nil, err |
| 324 | } |
| 325 | if addr.PortRangeSize() != 1 { |
| 326 | return nil, fmt.Errorf("resolver address must have exactly one address; cannot call %v", addr) |
| 327 | } |
| 328 | ash.resolvers = append(ash.resolvers, addr) |
| 329 | } |
| 330 | |
| 331 | var resolver *net.Resolver |
| 332 | if len(ash.resolvers) != 0 { |
| 333 | dialer := &net.Dialer{ |
| 334 | Timeout: 2 * time.Second, |
| 335 | } |
| 336 | resolver = &net.Resolver{ |
| 337 | PreferGo: true, |
| 338 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) { |
| 339 | //nolint:gosec |
| 340 | addr := ash.resolvers[weakrand.IntN(len(ash.resolvers))] |
| 341 | return dialer.DialContext(ctx, addr.Network, addr.JoinHostPort(0)) |
| 342 | }, |
| 343 | } |
| 344 | } else { |
| 345 | resolver = net.DefaultResolver |
| 346 | } |
| 347 | |
| 348 | return resolverClient{ |
| 349 | Client: acme.NewClient(), |
| 350 | resolver: resolver, |
| 351 | ctx: ash.ctx, |
| 352 | }, nil |
| 353 | } |
| 354 | |
| 355 | type resolverClient struct { |
| 356 | acme.Client |
no test coverage detected