Documentation
¶
Overview ¶
Package websteps implements the websteps experiment.
Specifications:
- test helper: https://github.com/ooni/spec/blob/master/backends/th-007-websteps.md
- experiment: N/A.
We are currently implementing:
- version 202108.17.1114 of the test helper spec.
- version N/A of the experiment spec.
Index ¶
- Variables
- func DNSDo(ctx context.Context, config DNSConfig) ([]string, error)
- func HTTPDo(req *http.Request, transport http.RoundTripper) (*http.Response, []byte, error)
- func NewDialerResolver(resolver model.Resolver) model.Dialer
- func NewExperimentMeasurer(config Config) model.ExperimentMeasurer
- func NewQUICDialerResolver(resolver model.Resolver) model.QUICDialer
- func NewRequest(ctx context.Context, URL *url.URL, headers http.Header) *http.Request
- func NewSingleH3Transport(qsess quic.EarlySession, tlscfg *tls.Config, qcfg *quic.Config) http.RoundTripper
- func NewSingleTransport(conn net.Conn) http.RoundTripper
- func NewTransportWithDialer(dialer model.Dialer, tlsConfig *tls.Config, handshaker model.TLSHandshaker) http.RoundTripper
- func QUICDo(ctx context.Context, config QUICConfig) (quic.EarlySession, error)
- func TCPDo(ctx context.Context, config TCPConfig) (net.Conn, error)
- func TLSDo(ctx context.Context, conn net.Conn, hostname string) (net.Conn, error)
- type Config
- type CtrlRequest
- type CtrlResponse
- type DNSConfig
- type DNSMeasurement
- type EndpointMeasurement
- type HTTPRequestMeasurement
- type HTTPResponseMeasurement
- type HTTPRoundTripMeasurement
- type Measurer
- type QUICConfig
- type QUICHandshakeMeasurement
- type RoundTripInfo
- type SingleDialer
- type SingleDialerH3
- type SummaryKeys
- type TCPConfig
- type TCPConnectMeasurement
- type TLSHandshakeMeasurement
- type TestKeys
- type URLMeasurement
Constants ¶
This section is empty.
Variables ¶
var ( // ErrNoAvailableTestHelpers is emitted when there are no available test helpers. ErrNoAvailableTestHelpers = errors.New("no available helpers") // ErrNoInput indicates that no input was provided ErrNoInput = errors.New("no input provided") // ErrInputIsNotAnURL indicates that the input is not an URL. ErrInputIsNotAnURL = errors.New("input is not an URL") // ErrUnsupportedInput indicates that the input URL scheme is unsupported. ErrUnsupportedInput = errors.New("unsupported input scheme") )
var ErrNoConnReuse = errors.New("cannot reuse connection")
var SupportedQUICVersions = map[string]bool{ "h3": true, }
SupportedQUICVersions are the H3 over QUIC versions we currently support
Functions ¶
func HTTPDo ¶
HTTPDo performs the HTTP check. Input: req *http.Request
The same request than the one used by the Explore step. This means that req contains the headers set by the original CtrlRequest, as well as, in case of a redirect chain, additional headers that were added due to redirects
transport http.RoundTripper:
The transport to use, either http.Transport, or http3.RoundTripper.
func NewDialerResolver ¶
NewDialerResolver contructs a new dialer for TCP connections, with default, errorwrapping and resolve functionalities
func NewExperimentMeasurer ¶
func NewExperimentMeasurer(config Config) model.ExperimentMeasurer
NewExperimentMeasurer creates a new ExperimentMeasurer.
func NewQUICDialerResolver ¶
func NewQUICDialerResolver(resolver model.Resolver) model.QUICDialer
NewQUICDialerResolver creates a new QUICDialerResolver with default, errorwrapping and resolve functionalities
func NewRequest ¶
func NewSingleH3Transport ¶
func NewSingleH3Transport(qsess quic.EarlySession, tlscfg *tls.Config, qcfg *quic.Config) http.RoundTripper
NewSingleH3Transport creates an http3.RoundTripper.
func NewSingleTransport ¶
func NewSingleTransport(conn net.Conn) http.RoundTripper
NewSingleTransport creates a new HTTP transport with a single-use dialer.
func NewTransportWithDialer ¶
func NewTransportWithDialer(dialer model.Dialer, tlsConfig *tls.Config, handshaker model.TLSHandshaker) http.RoundTripper
NewSingleTransport creates a new HTTP transport with a custom dialer and handshaker.
func QUICDo ¶
func QUICDo(ctx context.Context, config QUICConfig) (quic.EarlySession, error)
QUICDo performs the QUIC check.
Types ¶
type CtrlRequest ¶
type CtrlRequest struct {
// URL is the mandatory URL to measure.
URL string `json:"url"`
// Headers contains optional headers.
Headers map[string][]string `json:"headers"`
// Addrs contains the optional IP addresses resolved by the
// probe for the domain inside URL.
Addrs []string `json:"addrs"`
}
CtrlRequest is the request sent by the probe to the test helper.
type CtrlResponse ¶
type CtrlResponse struct {
// URLs contains the URLs we should measure. These URLs
// derive from CtrlRequest.URL.
URLs []*URLMeasurement `json:"urls"`
}
CtrlResponse is the response from the test helper.
func Control ¶
func Control( ctx context.Context, sess model.ExperimentSession, thAddr string, resourcePath string, creq CtrlRequest) (out CtrlResponse, err error)
Control performs the control request and returns the response.
type DNSMeasurement ¶
type DNSMeasurement struct {
// Domain is the domain we wanted to resolve.
Domain string `json:"domain"`
// Failure is the error that occurred.
Failure *string `json:"failure"`
// Addrs contains the resolved addresses.
Addrs []string `json:"addrs"`
}
DNSMeasurement is a DNS measurement.
type EndpointMeasurement ¶
type EndpointMeasurement struct {
// Endpoint is the endpoint we're measuring.
Endpoint string `json:"endpoint"`
// Protocol is one of "http", "https", and "h3".
Protocol string `json:"protocol"`
// TCPConnect is the TCP connect measurement. This field
// is only meaningful when protocol is "http" or "https."
TCPConnect *TCPConnectMeasurement `json:"tcp_connect"`
// QUICHandshake is the QUIC handshake measurement. This field
// is only meaningful when the protocol is "h3".
QUICHandshake *QUICHandshakeMeasurement `json:"quic_handshake"`
// TLSHandshake is the TLS handshake measurement. This field
// is only meaningful when the protocol is "https".
TLSHandshake *TLSHandshakeMeasurement `json:"tls_handshake"`
// HTTPRoundTrip is the related HTTP GET measurement.
HTTPRoundTrip *HTTPRoundTripMeasurement `json:"http_round_trip"`
}
EndpointMeasurement is an HTTP measurement where we are using a specific TCP/TLS/QUIC endpoint to get the URL.
The specification describes this data structure as the sum of three distinct types: HTTPEndpointMeasurement for "http", HTTPSEndpointMeasurement for "https", and H3EndpointMeasurement for "h3". We don't have sum types here, therefore we use the Protocol field to indicate which fields are meaningful.
type HTTPRequestMeasurement ¶
type HTTPRequestMeasurement struct {
// Method is the request method.
Method string `json:"method"`
// URL is the request URL.
URL string `json:"url"`
// Headers contains request headers.
Headers http.Header `json:"headers"`
}
HTTPRequestMeasurement contains request data.
type HTTPResponseMeasurement ¶
type HTTPResponseMeasurement struct {
// BodyLength contains the body length in bytes.
BodyLength int64 `json:"body_length"`
// Failure is the error that occurred.
Failure *string `json:"failure"`
// Headers contains response headers.
Headers http.Header `json:"headers"`
// StatusCode is the response status code.
StatusCode int64 `json:"status_code"`
}
HTTPResponseMeasurement contains response data.
type HTTPRoundTripMeasurement ¶
type HTTPRoundTripMeasurement struct {
// Request contains request data.
Request *HTTPRequestMeasurement `json:"request"`
// Response contains response data.
Response *HTTPResponseMeasurement `json:"response"`
}
HTTPRoundTripMeasurement contains a measured HTTP request and the corresponding response.
type Measurer ¶
type Measurer struct {
Config Config
}
Measurer performs the measurement.
func (Measurer) ExperimentName ¶
ExperimentName implements ExperimentMeasurer.ExperExperimentName.
func (Measurer) ExperimentVersion ¶
ExperimentVersion implements ExperimentMeasurer.ExperExperimentVersion.
func (Measurer) GetSummaryKeys ¶
func (m Measurer) GetSummaryKeys(measurement *model.Measurement) (interface{}, error)
GetSummaryKeys implements model.ExperimentMeasurer.GetSummaryKeys.
func (Measurer) Run ¶
func (m Measurer) Run( ctx context.Context, sess model.ExperimentSession, measurement *model.Measurement, callbacks model.ExperimentCallbacks, ) error
Run implements ExperimentMeasurer.Run.
type QUICConfig ¶
type QUICHandshakeMeasurement ¶
type QUICHandshakeMeasurement = TLSHandshakeMeasurement
QUICHandshakeMeasurement is a QUIC handshake measurement.
type RoundTripInfo ¶
type RoundTripInfo struct {
// Proto is the protocol used, it can be "h2", "http/1.1", "h3".
Proto string
// Request is the original HTTP request. Headers also include cookies.
Request *http.Request
// Response is the HTTP response.
Response *http.Response
// SortIndex is the index using for sorting round trips.
SortIndex int
}
RoundTripInfo contains info on a specific round trip. This data structure is not part of the test helper protocol. We use it _inside_ the test helper to describe the discovery phase where we gather all the URLs that can derive from a given URL.
type SingleDialer ¶
func (*SingleDialer) DialContext ¶
type SingleDialerH3 ¶
type SummaryKeys ¶
type SummaryKeys struct {
Accessible bool `json:"accessible"`
Blocking string `json:"blocking"`
IsAnomaly bool `json:"-"`
}
SummaryKeys contains summary keys for this experiment.
Note that this structure is part of the ABI contract with probe-cli therefore we should be careful when changing it.
type TCPConnectMeasurement ¶
type TCPConnectMeasurement struct {
// Failure is the error that occurred.
Failure *string `json:"failure"`
}
TCPConnectMeasurement is a TCP connect measurement.
type TLSHandshakeMeasurement ¶
type TLSHandshakeMeasurement struct {
// Failure is the error that occurred.
Failure *string `json:"failure"`
}
TLSHandshakeMeasurement is a TLS handshake measurement.
type TestKeys ¶
type TestKeys struct {
Agent string `json:"agent"`
ClientResolver string `json:"client_resolver"`
URLMeasurements []*URLMeasurement
}
TestKeys contains webconnectivity test keys.
type URLMeasurement ¶
type URLMeasurement struct {
// URL is the URL to which this measurement refers.
URL string `json:"url"`
// DNS contains the domain names resolved by the test helper.
DNS *DNSMeasurement `json:"dns"`
// Endpoints contains endpoint measurements.
Endpoints []*EndpointMeasurement `json:"endpoints"`
// RoundTrip is the related round trip. This field MUST NOT be
// exported as JSON, since it's only used internally by the test
// helper and it's completely ignored by the probe.
RoundTrip *RoundTripInfo `json:"-"`
}
URLMeasurement contains all the URLs measured by the test helper.