p2p/dnsdisc: add implementation of EIP-1459 (#20094)
This adds an implementation of node discovery via DNS TXT records to the go-ethereum library. The implementation doesn't match EIP-1459 exactly, the main difference being that this implementation uses separate merkle trees for tree links and ENRs. The EIP will be updated to match p2p/dnsdisc. To maintain DNS trees, cmd/devp2p provides a frontend for the p2p/dnsdisc library. The new 'dns' subcommands can be used to create, sign and deploy DNS discovery trees.
This commit is contained in:
101
vendor/github.com/cloudflare/cloudflare-go/options.go
generated
vendored
Normal file
101
vendor/github.com/cloudflare/cloudflare-go/options.go
generated
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
package cloudflare
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"time"
|
||||
|
||||
"golang.org/x/time/rate"
|
||||
)
|
||||
|
||||
// Option is a functional option for configuring the API client.
|
||||
type Option func(*API) error
|
||||
|
||||
// HTTPClient accepts a custom *http.Client for making API calls.
|
||||
func HTTPClient(client *http.Client) Option {
|
||||
return func(api *API) error {
|
||||
api.httpClient = client
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Headers allows you to set custom HTTP headers when making API calls (e.g. for
|
||||
// satisfying HTTP proxies, or for debugging).
|
||||
func Headers(headers http.Header) Option {
|
||||
return func(api *API) error {
|
||||
api.headers = headers
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UsingAccount allows you to apply account-level changes (Load Balancing,
|
||||
// Railguns) to an account instead.
|
||||
func UsingAccount(accountID string) Option {
|
||||
return func(api *API) error {
|
||||
api.AccountID = accountID
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UsingRateLimit applies a non-default rate limit to client API requests
|
||||
// If not specified the default of 4rps will be applied
|
||||
func UsingRateLimit(rps float64) Option {
|
||||
return func(api *API) error {
|
||||
// because ratelimiter doesnt do any windowing
|
||||
// setting burst makes it difficult to enforce a fixed rate
|
||||
// so setting it equal to 1 this effectively disables bursting
|
||||
// this doesn't check for sensible values, ultimately the api will enforce that the value is ok
|
||||
api.rateLimiter = rate.NewLimiter(rate.Limit(rps), 1)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UsingRetryPolicy applies a non-default number of retries and min/max retry delays
|
||||
// This will be used when the client exponentially backs off after errored requests
|
||||
func UsingRetryPolicy(maxRetries int, minRetryDelaySecs int, maxRetryDelaySecs int) Option {
|
||||
// seconds is very granular for a minimum delay - but this is only in case of failure
|
||||
return func(api *API) error {
|
||||
api.retryPolicy = RetryPolicy{
|
||||
MaxRetries: maxRetries,
|
||||
MinRetryDelay: time.Duration(minRetryDelaySecs) * time.Second,
|
||||
MaxRetryDelay: time.Duration(maxRetryDelaySecs) * time.Second,
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UsingLogger can be set if you want to get log output from this API instance
|
||||
// By default no log output is emitted
|
||||
func UsingLogger(logger Logger) Option {
|
||||
return func(api *API) error {
|
||||
api.logger = logger
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// UserAgent can be set if you want to send a software name and version for HTTP access logs.
|
||||
// It is recommended to set it in order to help future Customer Support diagnostics
|
||||
// and prevent collateral damage by sharing generic User-Agent string with abusive users.
|
||||
// E.g. "my-software/1.2.3". By default generic Go User-Agent is used.
|
||||
func UserAgent(userAgent string) Option {
|
||||
return func(api *API) error {
|
||||
api.UserAgent = userAgent
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// parseOptions parses the supplied options functions and returns a configured
|
||||
// *API instance.
|
||||
func (api *API) parseOptions(opts ...Option) error {
|
||||
// Range over each options function and apply it to our API type to
|
||||
// configure it. Options functions are applied in order, with any
|
||||
// conflicting options overriding earlier calls.
|
||||
for _, option := range opts {
|
||||
err := option(api)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user