1package lightstep
2
3import (
4	"context"
5	"io"
6	"net/http"
7
8	"github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb"
9)
10
11var accessTokenHeader = http.CanonicalHeaderKey("Lightstep-Access-Token")
12
13// Connection describes a closable connection. Exposed for testing.
14type Connection interface {
15	io.Closer
16}
17
18// ConnectorFactory is for testing purposes.
19type ConnectorFactory func() (interface{}, Connection, error)
20
21// collectorResponse encapsulates internal grpc/http responses.
22type collectorResponse interface {
23	GetErrors() []string
24	Disable() bool
25	DevMode() bool
26}
27
28// Collector encapsulates custom transport of protobuf messages
29type Collector interface {
30	Report(context.Context, *collectorpb.ReportRequest) (*collectorpb.ReportResponse, error)
31}
32
33type reportRequest struct {
34	protoRequest *collectorpb.ReportRequest
35	httpRequest  *http.Request
36}
37
38// collectorClient encapsulates internal grpc/http transports.
39type collectorClient interface {
40	Report(context.Context, reportRequest) (collectorResponse, error)
41	Translate(*collectorpb.ReportRequest) (reportRequest, error)
42	ConnectClient() (Connection, error)
43	ShouldReconnect() bool
44}
45
46func newCollectorClient(opts Options) (collectorClient, error) {
47	if opts.CustomCollector != nil {
48		return newCustomCollector(opts), nil
49	}
50	if opts.UseHttp {
51		return newHTTPCollectorClient(opts)
52	}
53	if opts.UseGRPC {
54		return newGrpcCollectorClient(opts)
55	}
56
57	// No transport specified, defaulting to HTTP
58	return newHTTPCollectorClient(opts)
59}
60