Documentation ¶
Overview ¶
Package nett steals from the standard library's net package and provides a dialer with a pluggable host resolver.
Example ¶
package main import ( "io" "io/ioutil" "net/http" "time" "github.com/abursavich/nett" ) func main() { dialer := &nett.Dialer{ // Cache successful DNS lookups for five minutes // using DefaultResolver to fill the cache. Resolver: &nett.CacheResolver{TTL: 5 * time.Minute}, // Concurrently dial an IPv4 and an IPv6 address and // return the connection that is established first. IPFilter: nett.DualStack, // Give up after ten seconds including DNS resolution. Timeout: 10 * time.Second, } client := &http.Client{ Transport: &http.Transport{ // Use the Dialer. Dial: dialer.Dial, }, } urls := []string{ "https://www.google.com/search?q=golang", // lookup google.com "https://www.google.com/search?q=godoc", // cached google.com "https://www.google.com/search?q=golang-nuts", // cached google.com } for _, url := range urls { resp, err := client.Get(url) if err != nil { panic(err) } io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() } }
Output:
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrMissingAddress = errors.New("missing address") ErrNoSuitableAddress = errors.New("no suitable address found") )
Functions ¶
Types ¶
type CacheResolver ¶
type CacheResolver struct { // Resolver resolves hosts that are not cached. // If Resolver is nil, DefaultResolver will be used. Resolver Resolver // TTL is the time to live for resolved hosts. // If TTL is zero, cached hosts do not expire. TTL time.Duration // contains filtered or unexported fields }
CacheResolver looks up the IP addresses of a host and caches successful results.
type Dialer ¶
type Dialer struct { // Timeout is the maximum amount of time a dial will wait for // a connect to complete. If Deadline is also set, it may fail // earlier. // // The default is no timeout. // // With or without a timeout, the operating system may impose // its own earlier timeout. For instance, TCP timeouts are // often around 3 minutes. Timeout time.Duration // Deadline is the absolute point in time after which dials // will fail. If Timeout is set, it may fail earlier. // // Zero means no deadline, or dependent on the operating system // as with the Timeout option. Deadline time.Time // LocalAddr is the local address to use when dialing an // address. The address must be of a compatible type for the // network being dialed. // // If nil, a local address is automatically chosen. LocalAddr net.Addr // Resolver is used to resolve IP addresses from domain names. // // If nil, DefaultResolver will be used. Resolver Resolver // IPFilter selects addresses from those available after // resolving a host to a set of supported IPs. // // When dialing a TCP connection if multiple addresses are // returned, then a connection will attempt to be established // with each address and the first that succeeds will be returned. // With any other type of connection, only the first address // returned will be dialed. // // If nil, a single address is selected. IPFilter func(ips []net.IP) []net.IP // KeepAlive specifies the keep-alive period for an active // network connection. // // If zero, keep-alives are not enabled. Network protocols // that do not support keep-alives ignore this field. // // Only functional for go1.3+. KeepAlive time.Duration }
A Dialer contains options for connecting to an address.
func (*Dialer) Dial ¶
Dial connects to the address on the named network.
Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only), "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4" (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and "unixpacket".
For TCP and UDP networks, addresses have the form host:port. If host is a literal IPv6 address it must be enclosed in square brackets as in "[::1]:80" or "[ipv6-host%zone]:80". The functions JoinHostPort and SplitHostPort manipulate addresses in this form.
Examples:
Dial("tcp", "12.34.56.78:80") Dial("tcp", "google.com:http") Dial("tcp", "[2001:db8::1]:http") Dial("tcp", "[fe80::1%lo0]:80")
For IP networks, the network must be "ip", "ip4" or "ip6" followed by a colon and a protocol number or name and the addr must be a literal IP address.
Examples:
Dial("ip4:1", "127.0.0.1") Dial("ip6:ospf", "::1")
For Unix networks, the address must be a file system path.
type Resolver ¶
type Resolver interface { // Resolve looks up the given host and returns its IP addresses. Resolve(host string) ([]net.IP, error) }
Resolver is an interface representing the ability to lookup the IP addresses of a host. It may return results containing networks not supported by the platform.
A Resolver must be safe for concurrent use by multiple goroutines.
var DefaultResolver Resolver = defaultResolver{}
DefaultResolver is the default Resolver.