58adb68b2c
* refactor: move tracex outside of engine/netx Consistently with https://github.com/ooni/probe/issues/2121 and https://github.com/ooni/probe/issues/2115, we can now move tracex outside of engine/netx. The main reason why this makes sense now is that the package is now changed significantly from the one that we imported from ooni/probe-engine. We have improved its implementation, which had not been touched significantly for quite some time, and converted it to unit testing. I will document tomorrow some extra work I'd like to do with this package but likely could not do $soon. * go fmt * regen tutorials
67 lines
2.2 KiB
Go
67 lines
2.2 KiB
Go
// Package dialer allows you to create a net.Dialer-compatible
|
|
// DialContext-enabled dialer with error wrapping, optional logging,
|
|
// optional network-events saving, and optional proxying.
|
|
package dialer
|
|
|
|
import (
|
|
"net/url"
|
|
|
|
"github.com/ooni/probe-cli/v3/internal/bytecounter"
|
|
"github.com/ooni/probe-cli/v3/internal/model"
|
|
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
|
"github.com/ooni/probe-cli/v3/internal/tracex"
|
|
)
|
|
|
|
// Config contains the settings for New.
|
|
type Config struct {
|
|
// ContextByteCounting optionally configures context-based
|
|
// byte counting. By default we don't do that.
|
|
//
|
|
// Use WithExperimentByteCounter and WithSessionByteCounter
|
|
// to assign byte counters to a context. The code will use
|
|
// corresponding, private functions to access the configured
|
|
// byte counters and will notify them about I/O events.
|
|
//
|
|
// Bug
|
|
//
|
|
// This implementation cannot properly account for the bytes that are sent by
|
|
// persistent connections, because they stick to the counters set when the
|
|
// connection was established. This typically means we miss the bytes sent and
|
|
// received when submitting a measurement. Such bytes are specifically not
|
|
// seen by the experiment specific byte counter.
|
|
//
|
|
// For this reason, this implementation may be heavily changed/removed.
|
|
ContextByteCounting bool
|
|
|
|
// DialSaver is the optional saver for dialing events. If not
|
|
// set, we will not save any dialing event.
|
|
DialSaver *tracex.Saver
|
|
|
|
// Logger is the optional logger. If not set, there
|
|
// will be no logging from the new dialer.
|
|
Logger model.DebugLogger
|
|
|
|
// ProxyURL is the optional proxy URL.
|
|
ProxyURL *url.URL
|
|
|
|
// ReadWriteSaver is like DialSaver but for I/O events.
|
|
ReadWriteSaver *tracex.Saver
|
|
}
|
|
|
|
// New creates a new Dialer from the specified config and resolver.
|
|
func New(config *Config, resolver model.Resolver) model.Dialer {
|
|
var logger model.DebugLogger = model.DiscardLogger
|
|
if config.Logger != nil {
|
|
logger = config.Logger
|
|
}
|
|
d := netxlite.NewDialerWithResolver(
|
|
logger, resolver, config.DialSaver.NewConnectObserver(),
|
|
config.ReadWriteSaver.NewReadWriteObserver(),
|
|
)
|
|
d = &netxlite.MaybeProxyDialer{ProxyURL: config.ProxyURL, Dialer: d}
|
|
if config.ContextByteCounting {
|
|
d = &bytecounter.ContextAwareDialer{Dialer: d}
|
|
}
|
|
return d
|
|
}
|