ooni-probe-cli/internal/engine/experiment/ndt7/dial.go
Simone Basso 06ee0e55a9
refactor(netx/dialer): hide implementation complexity (#372)
* refactor(netx/dialer): hide implementation complexity

This follows the blueprint of `module.Config` and `nodule.New`
described at https://github.com/ooni/probe/issues/1591.

* fix: ndt7 bug where we were not using the right resolver

* fix(legacy/netx): clarify irrelevant implementation change

* fix: improve comments

* fix(hhfm): do not use dialer.New b/c it breaks it

Unclear to me why this is happening. Still, improve upon the
previous situation by adding a timeout.

It does not seem a priority to look into this issue now.
2021-06-09 09:42:31 +02:00

88 lines
2.4 KiB
Go

package ndt7
import (
"context"
"crypto/tls"
"net/http"
"net/url"
"github.com/gorilla/websocket"
"github.com/ooni/probe-cli/v3/internal/engine/model"
"github.com/ooni/probe-cli/v3/internal/engine/netx/dialer"
"github.com/ooni/probe-cli/v3/internal/engine/netx/resolver"
)
type dialManager struct {
ndt7URL string
logger model.Logger
proxyURL *url.URL
readBufferSize int
tlsConfig *tls.Config
userAgent string
writeBufferSize int
}
func newDialManager(ndt7URL string, logger model.Logger, userAgent string) dialManager {
return dialManager{
ndt7URL: ndt7URL,
logger: logger,
readBufferSize: paramMaxBufferSize,
userAgent: userAgent,
writeBufferSize: paramMaxBufferSize,
}
}
func (mgr dialManager) dialWithTestName(ctx context.Context, testName string) (*websocket.Conn, error) {
var reso resolver.Resolver = resolver.SystemResolver{}
reso = resolver.LoggingResolver{Resolver: reso, Logger: mgr.logger}
dlr := dialer.New(&dialer.Config{
ContextByteCounting: true,
Logger: mgr.logger,
ProxyURL: mgr.proxyURL,
}, reso)
dialer := websocket.Dialer{
NetDialContext: dlr.DialContext,
ReadBufferSize: mgr.readBufferSize,
TLSClientConfig: mgr.tlsConfig,
WriteBufferSize: mgr.writeBufferSize,
}
headers := http.Header{}
headers.Add("Sec-WebSocket-Protocol", "net.measurementlab.ndt.v7")
headers.Add("User-Agent", mgr.userAgent)
mgr.logrequest(mgr.ndt7URL, headers)
conn, _, err := dialer.DialContext(ctx, mgr.ndt7URL, headers)
mgr.logresponse(err)
return conn, err
}
func (mgr dialManager) logrequest(url string, headers http.Header) {
mgr.logger.Debugf("> GET %s", url)
for key, values := range headers {
for _, v := range values {
mgr.logger.Debugf("> %s: %s", key, v)
}
}
mgr.logger.Debug("> Connection: upgrade")
mgr.logger.Debug("> Upgrade: websocket")
mgr.logger.Debug(">")
}
func (mgr dialManager) logresponse(err error) {
if err != nil {
mgr.logger.Debugf("< %+v", err)
return
}
mgr.logger.Debug("< 101")
mgr.logger.Debug("< Connection: upgrade")
mgr.logger.Debug("< Upgrade: websocket")
mgr.logger.Debug("<")
}
func (mgr dialManager) dialDownload(ctx context.Context) (*websocket.Conn, error) {
return mgr.dialWithTestName(ctx, "download")
}
func (mgr dialManager) dialUpload(ctx context.Context) (*websocket.Conn, error) {
return mgr.dialWithTestName(ctx, "upload")
}