Documentation ¶
Overview ¶
Package net provides generic network related functions used across Skipper, which might be useful also in other contexts than Skipper.
Index ¶
- Constants
- func NewJumpHash(shards []string) redis.ConsistentHash
- func NewMultiprobe(shards []string) redis.ConsistentHash
- func NewRendezvous(shards []string) redis.ConsistentHash
- func NewRendezvousVnodes(shards []string) redis.ConsistentHash
- func ParseIPCIDRs(cidrs []string) (*netipx.IPSet, error)
- func RemoteAddr(r *http.Request) netip.Addr
- func RemoteAddrFromLast(r *http.Request) netip.Addr
- func RemoteHost(r *http.Request) net.IP
- func RemoteHostFromLast(r *http.Request) net.IP
- func SchemeHost(input string) (string, string, error)
- type Client
- func (c *Client) Close()
- func (c *Client) CloseIdleConnections()
- func (c *Client) Do(req *http.Request) (*http.Response, error)
- func (c *Client) Get(url string) (*http.Response, error)
- func (c *Client) Head(url string) (*http.Response, error)
- func (c *Client) Post(url, contentType string, body io.Reader) (*http.Response, error)
- func (c *Client) PostForm(url string, data url.Values) (*http.Response, error)
- type ForwardedHeaders
- type ForwardedHeadersHandler
- type HostPatch
- type HostPatchHandler
- type IPNets
- type Options
- type RedisOptions
- type RedisRingClient
- func (r *RedisRingClient) Close()
- func (r *RedisRingClient) Expire(ctx context.Context, key string, expiration time.Duration) (bool, error)
- func (r *RedisRingClient) Get(ctx context.Context, key string) (string, error)
- func (r *RedisRingClient) NewScript(source string) *RedisScript
- func (r *RedisRingClient) RingAvailable() bool
- func (r *RedisRingClient) RunScript(ctx context.Context, s *RedisScript, keys []string, args ...interface{}) (interface{}, error)
- func (r *RedisRingClient) Set(ctx context.Context, key string, value interface{}, expiration time.Duration) (string, error)
- func (r *RedisRingClient) SetAddrs(ctx context.Context, addrs []string)
- func (r *RedisRingClient) StartMetricsCollection()
- func (r *RedisRingClient) StartSpan(operationName string, opts ...opentracing.StartSpanOption) opentracing.Span
- func (r *RedisRingClient) ZAdd(ctx context.Context, key string, val int64, score float64) (int64, error)
- func (r *RedisRingClient) ZCard(ctx context.Context, key string) (int64, error)
- func (r *RedisRingClient) ZRangeByScoreWithScoresFirst(ctx context.Context, key string, min, max float64, offset, count int64) (interface{}, error)
- func (r *RedisRingClient) ZRem(ctx context.Context, key string, members ...interface{}) (int64, error)
- func (r *RedisRingClient) ZRemRangeByScore(ctx context.Context, key string, min, max float64) (int64, error)
- type RedisScript
- type RequestMatchHandler
- type Transport
- type ValidateQueryHandler
- type ValidateQueryLogHandler
Examples ¶
Constants ¶
const ( // DefaultReadTimeout is the default socket read timeout DefaultReadTimeout = 25 * time.Millisecond // DefaultWriteTimeout is the default socket write timeout DefaultWriteTimeout = 25 * time.Millisecond // DefaultPoolTimeout is the default timeout to access the connection pool DefaultPoolTimeout = 25 * time.Millisecond // DefaultDialTimeout is the default dial timeout DefaultDialTimeout = 25 * time.Millisecond // DefaultMinConns is the default minimum of connections DefaultMinConns = 100 // DefaultMaxConns is the default maximum of connections DefaultMaxConns = 100 )
Variables ¶
This section is empty.
Functions ¶
func NewJumpHash ¶ added in v0.13.76
func NewJumpHash(shards []string) redis.ConsistentHash
func NewMultiprobe ¶ added in v0.13.76
func NewMultiprobe(shards []string) redis.ConsistentHash
func NewRendezvous ¶ added in v0.13.76
func NewRendezvous(shards []string) redis.ConsistentHash
func NewRendezvousVnodes ¶ added in v0.13.76
func NewRendezvousVnodes(shards []string) redis.ConsistentHash
func ParseIPCIDRs ¶ added in v0.15.14
ParseIPCIDRs returns a valid IPSet in case there is no parsing error.
func RemoteAddr ¶ added in v0.15.14
RemoteAddr returns the remote address of the client. When the 'X-Forwarded-For' header is set, then it is used instead. This is how most often proxies behave. Wikipedia shows the format https://en.wikipedia.org/wiki/X-Forwarded-For#Format
Example:
X-Forwarded-For: client, proxy1, proxy2
func RemoteAddrFromLast ¶ added in v0.15.14
RemoteAddrFromLast returns the remote address of the client. When the 'X-Forwarded-For' header is set, then it is used instead. This is known to be true for AWS Application LoadBalancer. AWS docs https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
Example:
X-Forwarded-For: ip-address-1, ip-address-2, client-ip-address
func RemoteHostFromLast ¶ added in v0.9.164
RemoteHostFromLast is *deprecated* use RemoteAddrFromLast instead
func SchemeHost ¶ added in v0.18.97
SchemeHost parses URI string (without #fragment part) and returns schema used in this URI as first return value and host[:port] part as second return value. Port is never omitted for HTTP(S): if no port is specified in URI, default port for given schema is used. If URI is invalid, error is returned.
Types ¶
type Client ¶ added in v0.11.42
type Client struct {
// contains filtered or unexported fields
}
Client adds additional features like Bearer token injection, and opentracing to the wrapped http.Client with the same interface as http.Client from the stdlib.
Example ¶
tracer := lightstep.NewTracer(lightstep.Options{}) cli := net.NewClient(net.Options{ Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", BearerTokenRefreshInterval: 10 * time.Second, BearerTokenFile: "/tmp/foo.token", IdleConnTimeout: 2 * time.Second, }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
Example (CustomTracer) ¶
mockTracer := mocktracer.New() cli := net.NewClient(net.Options{ Tracer: &customTracer{mockTracer}, OpentracingSpanName: "clientSpan", }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {})) defer srv.Close() cli.Get("http://" + srv.Listener.Addr().String() + "/") fmt.Printf("customtag: %s", mockTracer.FinishedSpans()[0].Tags()["customtag"])
Output: customtag: test
Example (FileSecretsReader) ¶
tracer := lightstep.NewTracer(lightstep.Options{}) sp := secrets.NewSecretPaths(10 * time.Second) if err := sp.Add("/tmp/bar.token"); err != nil { log.Fatalf("failed to read secret: %v", err) } cli := net.NewClient(net.Options{ Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", SecretsReader: sp, IdleConnTimeout: 2 * time.Second, }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
Example (HostSecret) ¶
tracer := lightstep.NewTracer(lightstep.Options{}) sec := []byte("mysecret") cli := net.NewClient(net.Options{ Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", SecretsReader: secrets.NewHostSecret( newTestSecretsReader( map[string][]byte{ "key": sec, }, ), map[string]string{ "127.0.0.1": "key", }, ), IdleConnTimeout: 2 * time.Second, }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
Example (StaticDelegateSecret) ¶
tracer := lightstep.NewTracer(lightstep.Options{}) sec := []byte("mysecret") cli := net.NewClient(net.Options{ Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", SecretsReader: secrets.NewStaticDelegateSecret( newTestSecretsReader( map[string][]byte{ "key": sec, }, ), "key", ), IdleConnTimeout: 2 * time.Second, }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
Example (StaticSecret) ¶
tracer := lightstep.NewTracer(lightstep.Options{}) sec := []byte("mysecret") cli := net.NewClient(net.Options{ Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", SecretsReader: secrets.StaticSecret(sec), IdleConnTimeout: 2 * time.Second, }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
Example (WithTransport) ¶
tracer := lightstep.NewTracer(lightstep.Options{}) d := stdlibnet.Dialer{ Timeout: 3 * time.Second, KeepAlive: 30 * time.Second, DualStack: true, } f := d.DialContext cli := net.NewClient(net.Options{ Transport: &http.Transport{ IdleConnTimeout: 10 * time.Second, DialContext: f, }, Tracer: tracer, OpentracingComponentTag: "testclient", OpentracingSpanName: "clientSpan", BearerTokenRefreshInterval: 10 * time.Second, BearerTokenFile: "/tmp/foo.token", }) defer cli.Close() srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" for i := 0; i < 15; i++ { rsp, err := cli.Get(u) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode) time.Sleep(1 * time.Second) }
Output:
func NewClient ¶ added in v0.11.42
NewClient creates a wrapped http.Client and uses Transport to support OpenTracing. On teardown you have to use Close() to not leak a goroutine.
If secrets.SecretsReader is nil, but BearerTokenFile is not empty string, it creates StaticDelegateSecret with a wrapped secrets.SecretPaths, which can be used with Kubernetes secrets to read from the secret an automatically updated Bearer token.
func (*Client) CloseIdleConnections ¶ added in v0.11.42
func (c *Client) CloseIdleConnections()
CloseIdleConnections delegates the call to the underlying http.Client.
func (*Client) Do ¶ added in v0.11.42
Do delegates the given http.Request to the underlying http.Client and adds a Bearer token to the authorization header, if Client has a secrets.SecretsReader and the request does not contain an Authorization header.
type ForwardedHeaders ¶ added in v0.13.99
type ForwardedHeaders struct { // For sets or appends request remote IP to the X-Forwarded-For header For bool // PrependFor sets or prepends request remote IP to the X-Forwarded-For header, overrides For PrependFor bool // Host sets X-Forwarded-Host to the request host Host bool // Method sets the http method as X-Forwarded-Method to the request header Method bool // Uri sets the path and query as X-Forwarded-Uri header to the request header Uri bool // Sets X-Forwarded-Port value Port string // Sets X-Forwarded-Proto value Proto string }
ForwardedHeaders sets non-standard X-Forwarded-* Headers See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#proxies and https://github.com/authelia/authelia
func (*ForwardedHeaders) Set ¶ added in v0.13.99
func (h *ForwardedHeaders) Set(req *http.Request)
type ForwardedHeadersHandler ¶ added in v0.13.99
type ForwardedHeadersHandler struct { Headers ForwardedHeaders Exclude IPNets Handler http.Handler }
func (*ForwardedHeadersHandler) ServeHTTP ¶ added in v0.13.99
func (h *ForwardedHeadersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
type HostPatch ¶ added in v0.13.147
type HostPatch struct { // Remove port if present RemovePort bool // Remove trailing dot if present RemoteTrailingDot bool // Convert to lowercase ToLower bool }
HostPatch is used to modify host[:port] string
type HostPatchHandler ¶ added in v0.13.147
func (*HostPatchHandler) ServeHTTP ¶ added in v0.13.147
func (h *HostPatchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
type IPNets ¶ added in v0.13.99
IPNets is *deprecated* use netipx.IPSet instead
func ParseCIDRs ¶ added in v0.13.99
ParseCIDRs is *deprecated* use ParseIPCIDRs.
type Options ¶ added in v0.11.19
type Options struct { // Transport see https://golang.org/pkg/net/http/#Transport // In case Transport is not nil, the Transport arguments are used below. Transport *http.Transport // CheckRedirect see https://golang.org/pkg/net/http/#Client CheckRedirect func(req *http.Request, via []*http.Request) error // Proxy see https://golang.org/pkg/net/http/#Transport.Proxy Proxy func(req *http.Request) (*url.URL, error) // DisableKeepAlives see https://golang.org/pkg/net/http/#Transport.DisableKeepAlives DisableKeepAlives bool // DisableCompression see https://golang.org/pkg/net/http/#Transport.DisableCompression DisableCompression bool // ForceAttemptHTTP2 see https://golang.org/pkg/net/http/#Transport.ForceAttemptHTTP2 ForceAttemptHTTP2 bool // MaxIdleConns see https://golang.org/pkg/net/http/#Transport.MaxIdleConns MaxIdleConns int // MaxIdleConnsPerHost see https://golang.org/pkg/net/http/#Transport.MaxIdleConnsPerHost MaxIdleConnsPerHost int // MaxConnsPerHost see https://golang.org/pkg/net/http/#Transport.MaxConnsPerHost MaxConnsPerHost int // WriteBufferSize see https://golang.org/pkg/net/http/#Transport.WriteBufferSize WriteBufferSize int // ReadBufferSize see https://golang.org/pkg/net/http/#Transport.ReadBufferSize ReadBufferSize int // MaxResponseHeaderBytes see // https://golang.org/pkg/net/http/#Transport.MaxResponseHeaderBytes MaxResponseHeaderBytes int64 // Timeout sets all Timeouts, that are set to 0 to the given // value. Basically it's the default timeout value. Timeout time.Duration // TLSHandshakeTimeout see // https://golang.org/pkg/net/http/#Transport.TLSHandshakeTimeout, // if not set or set to 0, its using Options.Timeout. TLSHandshakeTimeout time.Duration // IdleConnTimeout see // https://golang.org/pkg/net/http/#Transport.IdleConnTimeout, // if not set or set to 0, its using Options.Timeout. IdleConnTimeout time.Duration // ResponseHeaderTimeout see // https://golang.org/pkg/net/http/#Transport.ResponseHeaderTimeout, // if not set or set to 0, its using Options.Timeout. ResponseHeaderTimeout time.Duration // ExpectContinueTimeout see // https://golang.org/pkg/net/http/#Transport.ExpectContinueTimeout, // if not set or set to 0, its using Options.Timeout. ExpectContinueTimeout time.Duration // Tracer instance, can be nil to not enable tracing Tracer opentracing.Tracer // OpentracingComponentTag sets component tag for all requests OpentracingComponentTag string // OpentracingSpanName sets span name for all requests OpentracingSpanName string // BearerTokenFile injects bearer token read from file, which // file path is the given string. In case SecretsReader is // provided, BearerTokenFile will be ignored. BearerTokenFile string // BearerTokenRefreshInterval refresh bearer from // BearerTokenFile. In case SecretsReader is provided, // BearerTokenFile will be ignored. BearerTokenRefreshInterval time.Duration // SecretsReader is used to read and refresh bearer tokens SecretsReader secrets.SecretsReader // Log is used for error logging Log logging.Logger }
Options are mostly passed to the http.Transport of the same name. Options.Timeout can be used as default for all timeouts, that are not set. You can pass an opentracing.Tracer https://godoc.org/github.com/opentracing/opentracing-go#Tracer, which can be nil to get the https://godoc.org/github.com/opentracing/opentracing-go#NoopTracer.
type RedisOptions ¶ added in v0.13.38
type RedisOptions struct { // Addrs are the list of redis shards Addrs []string // AddrUpdater is a func that is regularly called to update // redis address list. This func should return a list of redis // shards. AddrUpdater func() ([]string, error) // UpdateInterval is the time.Duration that AddrUpdater is // triggered and SetAddrs be used to update the redis shards UpdateInterval time.Duration // Password is the password needed to connect to Redis server Password string // ReadTimeout for redis socket reads ReadTimeout time.Duration // WriteTimeout for redis socket writes WriteTimeout time.Duration // DialTimeout is the max time.Duration to dial a new connection DialTimeout time.Duration // PoolTimeout is the max time.Duration to get a connection from pool PoolTimeout time.Duration // IdleTimeout requires a non 0 IdleCheckFrequency IdleTimeout time.Duration // IdleCheckFrequency - reaper frequency, only used if IdleTimeout > 0 IdleCheckFrequency time.Duration // MaxConnAge MaxConnAge time.Duration // MinIdleConns is the minimum number of socket connections to redis MinIdleConns int // MaxIdleConns is the maximum number of socket connections to redis MaxIdleConns int // HeartbeatFrequency frequency of PING commands sent to check // shards availability. HeartbeatFrequency time.Duration // ConnMetricsInterval defines the frequency of updating the redis // connection related metrics. Defaults to 60 seconds. ConnMetricsInterval time.Duration // MetricsPrefix is the prefix for redis ring client metrics, // defaults to "swarm.redis." if not set MetricsPrefix string // Tracer provides OpenTracing for Redis queries. Tracer opentracing.Tracer // Log is the logger that is used Log logging.Logger // HashAlgorithm is one of rendezvous, rendezvousVnodes, jump, mpchash, defaults to github.com/go-redis/redis default HashAlgorithm string }
RedisOptions is used to configure the redis.Ring
type RedisRingClient ¶ added in v0.13.38
type RedisRingClient struct {
// contains filtered or unexported fields
}
RedisRingClient is a redis client that does access redis by computing a ring hash. It logs to the logging.Logger interface, that you can pass. It adds metrics and operations are traced with opentracing. You can set timeouts and the defaults are set to be ok to be in the hot path of low latency production requests.
func NewRedisRingClient ¶ added in v0.13.38
func NewRedisRingClient(ro *RedisOptions) *RedisRingClient
func (*RedisRingClient) Close ¶ added in v0.13.38
func (r *RedisRingClient) Close()
func (*RedisRingClient) NewScript ¶ added in v0.13.208
func (r *RedisRingClient) NewScript(source string) *RedisScript
func (*RedisRingClient) RingAvailable ¶ added in v0.13.38
func (r *RedisRingClient) RingAvailable() bool
func (*RedisRingClient) RunScript ¶ added in v0.13.208
func (r *RedisRingClient) RunScript(ctx context.Context, s *RedisScript, keys []string, args ...interface{}) (interface{}, error)
func (*RedisRingClient) SetAddrs ¶ added in v0.13.232
func (r *RedisRingClient) SetAddrs(ctx context.Context, addrs []string)
func (*RedisRingClient) StartMetricsCollection ¶ added in v0.13.38
func (r *RedisRingClient) StartMetricsCollection()
func (*RedisRingClient) StartSpan ¶ added in v0.13.38
func (r *RedisRingClient) StartSpan(operationName string, opts ...opentracing.StartSpanOption) opentracing.Span
func (*RedisRingClient) ZRangeByScoreWithScoresFirst ¶ added in v0.13.38
func (*RedisRingClient) ZRemRangeByScore ¶ added in v0.13.38
type RedisScript ¶ added in v0.13.208
type RedisScript struct {
// contains filtered or unexported fields
}
type RequestMatchHandler ¶ added in v0.13.160
func (*RequestMatchHandler) ServeHTTP ¶ added in v0.13.160
func (h *RequestMatchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
type Transport ¶ added in v0.11.19
type Transport struct {
// contains filtered or unexported fields
}
Transport wraps an http.Transport and adds support for tracing and bearerToken injection.
Example ¶
tracer := lightstep.NewTracer(lightstep.Options{}) cli := net.NewTransport(net.Options{ Tracer: tracer, }) defer cli.Close() cli = net.WithSpanName(cli, "myspan") cli = net.WithBearerToken(cli, "mytoken") srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Authorization: %s", r.Header.Get("Authorization")) log.Printf("Ot-Tracer-Sampled: %s", r.Header.Get("Ot-Tracer-Sampled")) log.Printf("Ot-Tracer-Traceid: %s", r.Header.Get("Ot-Tracer-Traceid")) log.Printf("Ot-Tracer-Spanid: %s", r.Header.Get("Ot-Tracer-Spanid")) w.WriteHeader(http.StatusOK) })) defer srv.Close() u := "http://" + srv.Listener.Addr().String() + "/" req, err := http.NewRequest("GET", u, nil) if err != nil { log.Fatalf("Failed to create request: %v", err) } rsp, err := cli.RoundTrip(req) if err != nil { log.Fatalf("Failed to do request: %v", err) } log.Printf("rsp code: %v", rsp.StatusCode)
Output:
func NewTransport ¶ added in v0.11.19
NewTransport creates a wrapped http.Transport, with regular DNS lookups using CloseIdleConnections on every IdleConnTimeout. You can optionally add tracing. On teardown you have to use Close() to not leak a goroutine.
func WithBearerToken ¶ added in v0.11.19
WithBearerToken adds an Authorization header with "Bearer " prefix and add the given bearerToken as value to all requests. To regular update your token you need to call this method and use the returned Transport.
func WithComponentTag ¶ added in v0.11.19
WithComponentTag sets the component name, if you have an enabled tracing Transport.
func WithSpanName ¶ added in v0.11.19
WithSpanName sets the name of the span, if you have an enabled tracing Transport.
func (*Transport) CloseIdleConnections ¶ added in v0.11.42
func (t *Transport) CloseIdleConnections()
type ValidateQueryHandler ¶ added in v0.13.218
func (*ValidateQueryHandler) ServeHTTP ¶ added in v0.13.218
func (q *ValidateQueryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
type ValidateQueryLogHandler ¶ added in v0.13.223
func (*ValidateQueryLogHandler) ServeHTTP ¶ added in v0.13.223
func (q *ValidateQueryLogHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)