nett

package module
v0.0.0-...-f31118c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 17, 2015 License: BSD-3-Clause Imports: 7 Imported by: 7

README

nett GoDoc Build Status

import "github.com/abursavich/nett"

Package nett steals from the standard library's net package and provides a dialer with a pluggable host resolver.

Example:
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",
    "https://www.google.com/search?q=godoc",
    "https://www.google.com/search?q=golang-nuts",
}
for _, url := range urls {
    resp, err := client.Get(url)
    if err != nil {
        panic(err)
    }
    io.Copy(ioutil.Discard, resp.Body)
    resp.Body.Close()
}

func DualStack

func DualStack(ips []net.IP) []net.IP

DualStack selects the first IPv4 address and IPv6 address in ips.

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.

func (*CacheResolver) Resolve
func (r *CacheResolver) Resolve(host string) ([]net.IP, error)

Resolve returns a host's IP addresses.

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
func (d *Dialer) Dial(network, address string) (net.Conn, error)

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.


Generated by godoc2md

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

View Source
var (
	ErrMissingAddress    = errors.New("missing address")
	ErrNoSuitableAddress = errors.New("no suitable address found")
)

Functions

func DualStack

func DualStack(ips []net.IP) []net.IP

DualStack selects the first IPv4 address and IPv6 address in ips.

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.

func (*CacheResolver) Resolve

func (r *CacheResolver) Resolve(host string) ([]net.IP, error)

Resolve returns a host's IP addresses.

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

func (d *Dialer) Dial(network, address string) (net.Conn, error)

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL