From 8b1381548abd8bec39056a2209299694c88f0e7c Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Mon, 5 Feb 2024 21:24:08 +0100 Subject: [PATCH] BREAKING CHANGE: feat: move StreamAllContext to netxlite (#1490) This diff moves the `StreamAllContext` implementation from `webconnectivitylte` to `netxlite`. We flagged this diff as BREAKING CHANGE because we also fixed a bug where, in case of context timeout, `StreamAllContext` was suppressing the error rather than reporting it. Re-reading the code, that felt incorrect because it did not allow us to clearly know that we timed out reading the body, which could be caused by throttling. The new behavior seems more accurate. Because of this change, I also felt it was time to add explicit tests for cases where we download fails because it takes too much time for us to fetch the whole response body. I am not 100% sure we are correctly flagging this case, but an `http-failure` probably seems fine at the moment and we can always revisit this as we learn more about throttling. Part of https://github.com/ooni/probe/issues/2654. --- go.mod | 2 +- go.sum | 4 +- .../webconnectivitylte/cleartextflow.go | 2 +- internal/experiment/webconnectivitylte/iox.go | 81 - .../webconnectivitylte/secureflow.go | 2 +- .../experiment/webconnectivityqa/testcase.go | 3 + .../webconnectivityqa/throttling.go | 72 + .../throttlingWithHTTP/analysis.json | 690 +++++++ .../throttlingWithHTTP/analysis_classic.json | 266 +++ .../throttlingWithHTTP/measurement.json | 1599 +++++++++++++++++ .../throttlingWithHTTP/observations.json | 645 +++++++ .../observations_classic.json | 226 +++ .../throttlingWithHTTPS/analysis.json | 425 +++++ .../throttlingWithHTTPS/analysis_classic.json | 267 +++ .../throttlingWithHTTPS/measurement.json | 1055 +++++++++++ .../throttlingWithHTTPS/observations.json | 383 ++++ .../observations_classic.json | 226 +++ internal/netxlite/iox.go | 105 +- internal/netxlite/iox_test.go | 130 ++ 19 files changed, 6094 insertions(+), 89 deletions(-) delete mode 100644 internal/experiment/webconnectivitylte/iox.go create mode 100644 internal/experiment/webconnectivityqa/throttling.go create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations_classic.json diff --git a/go.mod b/go.mod index 10b779b320..4303b0a883 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/miekg/dns v1.1.57 github.com/mitchellh/go-wordwrap v1.0.1 github.com/montanaflynn/stats v0.7.1 - github.com/ooni/netem v0.0.0-20231213064826-3cc1ea5e942c + github.com/ooni/netem v0.0.0-20240205182847-14e4ce92d41e github.com/ooni/oocrypto v0.5.7 github.com/ooni/oohttp v0.6.7 github.com/ooni/probe-assets v0.21.0 diff --git a/go.sum b/go.sum index 2dd5c69780..4993865187 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/ooni/netem v0.0.0-20231213064826-3cc1ea5e942c h1:T6Li/1zerzLDRaST/B2TQlmKE1XIdqeewQtd9c59t9U= -github.com/ooni/netem v0.0.0-20231213064826-3cc1ea5e942c/go.mod h1:b/wAvTR5n92Vk2b0SBmuMU0xO4ZGVrsXtU7zjTby7vw= +github.com/ooni/netem v0.0.0-20240205182847-14e4ce92d41e h1:OwDVOPs8NBLb1yEZXnn7rbfbBQJVOpIgEZsqq6QpqG8= +github.com/ooni/netem v0.0.0-20240205182847-14e4ce92d41e/go.mod h1:b/wAvTR5n92Vk2b0SBmuMU0xO4ZGVrsXtU7zjTby7vw= github.com/ooni/oocrypto v0.5.7 h1:QEb1KTh5gZ9s1IQjk7rNF076YVwit+2sDKNbo39IEa8= github.com/ooni/oocrypto v0.5.7/go.mod h1:HjEQ5pQBl6btcWgAsKKq1tFo8CfBrZu63C/vPAUGIDk= github.com/ooni/oohttp v0.6.7 h1:wmCjx9+gzx7p1xc/kMAmgXSgXKu7G8CAmil4Zii3g10= diff --git a/internal/experiment/webconnectivitylte/cleartextflow.go b/internal/experiment/webconnectivitylte/cleartextflow.go index 56423f89dd..f6440098be 100644 --- a/internal/experiment/webconnectivitylte/cleartextflow.go +++ b/internal/experiment/webconnectivitylte/cleartextflow.go @@ -267,7 +267,7 @@ func (t *CleartextFlow) httpTransaction(ctx context.Context, network, address, a t.CookieJar.SetCookies(req.URL, cookies) } reader := io.LimitReader(resp.Body, maxbody) - body, err = StreamAllContext(ctx, reader) + body, err = netxlite.StreamAllContext(ctx, reader) } if err == nil && httpRedirectIsRedirect(resp) { err = httpValidateRedirect(resp) diff --git a/internal/experiment/webconnectivitylte/iox.go b/internal/experiment/webconnectivitylte/iox.go deleted file mode 100644 index 4ae851c4a2..0000000000 --- a/internal/experiment/webconnectivitylte/iox.go +++ /dev/null @@ -1,81 +0,0 @@ -package webconnectivitylte - -// -// Extensions to incrementally stream-reading a response body. -// - -import ( - "context" - "errors" - "io" - - "github.com/ooni/probe-cli/v3/internal/netxlite" -) - -// StreamAllContext streams from the given reader [r] until -// interrupted by [ctx] or when [r] hits the EOF. -// -// This function runs a background goroutine that should exit as soon -// as [ctx] is done or when [reader] is closed, if applicable. -// -// This function transforms an errors.Is(err, io.EOF) to a nil error -// such as the standard library's ReadAll does. -// -// This function might return a non-zero-length buffer along with -// an non-nil error in the case in which we could only read a portion -// of the body and then we were interrupted by the error. -func StreamAllContext(ctx context.Context, reader io.Reader) ([]byte, error) { - // TODO(bassosimone): consider merging into the ./internal/netxlite/iox.go file - // once this code has been used in testing for quite some time - datach, errch := make(chan []byte), make(chan error) - - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - go func() { - for { - // Implementation note: the buffer MUST be created at each - // loop, otherwise we're data-racing with the reader. - buffer := make([]byte, 1<<13) - count, err := reader.Read(buffer) - if count > 0 { - data := buffer[:count] - select { - case datach <- data: - // fallthrough to check error - case <-ctx.Done(): - return - } - } - if err != nil { - select { - case errch <- err: - return - case <-ctx.Done(): - return - } - } - } - }() - - resultbuf := make([]byte, 0, 1<<17) - for { - select { - case data := <-datach: - // TODO(bassosimone): is there a more efficient way? - resultbuf = append(resultbuf, data...) - case err := <-errch: - if errors.Is(err, io.EOF) { - // see https://github.com/ooni/probe/issues/1965 - return resultbuf, nil - } - return resultbuf, netxlite.NewTopLevelGenericErrWrapper(err) - case <-ctx.Done(): - err := ctx.Err() - if errors.Is(err, context.DeadlineExceeded) { - return resultbuf, nil - } - return resultbuf, netxlite.NewTopLevelGenericErrWrapper(err) - } - } -} diff --git a/internal/experiment/webconnectivitylte/secureflow.go b/internal/experiment/webconnectivitylte/secureflow.go index 062534ed4f..4a7d72595b 100644 --- a/internal/experiment/webconnectivitylte/secureflow.go +++ b/internal/experiment/webconnectivitylte/secureflow.go @@ -322,7 +322,7 @@ func (t *SecureFlow) httpTransaction(ctx context.Context, network, address, alpn t.CookieJar.SetCookies(req.URL, cookies) } reader := io.LimitReader(resp.Body, maxbody) - body, err = StreamAllContext(ctx, reader) + body, err = netxlite.StreamAllContext(ctx, reader) } if err == nil && httpRedirectIsRedirect(resp) { err = httpValidateRedirect(resp) diff --git a/internal/experiment/webconnectivityqa/testcase.go b/internal/experiment/webconnectivityqa/testcase.go index d837308db8..078160c573 100644 --- a/internal/experiment/webconnectivityqa/testcase.go +++ b/internal/experiment/webconnectivityqa/testcase.go @@ -92,6 +92,9 @@ func AllTestCases() []*TestCase { tcpBlockingConnectTimeout(), tcpBlockingConnectionRefusedWithInconsistentDNS(), + throttlingWithHTTP(), + throttlingWithHTTPS(), + tlsBlockingConnectionResetWithConsistentDNS(), tlsBlockingConnectionResetWithInconsistentDNS(), diff --git a/internal/experiment/webconnectivityqa/throttling.go b/internal/experiment/webconnectivityqa/throttling.go new file mode 100644 index 0000000000..77d4786696 --- /dev/null +++ b/internal/experiment/webconnectivityqa/throttling.go @@ -0,0 +1,72 @@ +package webconnectivityqa + +import ( + "time" + + "github.com/apex/log" + "github.com/ooni/netem" + "github.com/ooni/probe-cli/v3/internal/netemx" +) + +// throttlingWithHTTP is the case where an HTTP website has throttling configured for it. +func throttlingWithHTTP() *TestCase { + return &TestCase{ + Name: "throttlingWithHTTP", + Flags: TestCaseFlagNoV04, + Input: "http://largefile.com/", + Configure: func(env *netemx.QAEnv) { + + env.DPIEngine().AddRule(&netem.DPIThrottleTrafficForTCPEndpoint{ + Delay: 300 * time.Millisecond, + Logger: log.Log, + PLR: 0.1, + ServerIPAddress: netemx.AddressLargeFileCom1, + ServerPort: 80, + }) + + env.DPIEngine().AddRule(&netem.DPIThrottleTrafficForTCPEndpoint{ + Delay: 300 * time.Millisecond, + Logger: log.Log, + PLR: 0.1, + ServerIPAddress: netemx.AddressLargeFileCom2, + ServerPort: 80, + }) + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "consistent", + HTTPExperimentFailure: "generic_timeout_error", + XBlockingFlags: 8, // AnalysisBlockingFlagHTTPBlocking + Accessible: false, + Blocking: "http-failure", + }, + } +} + +// throttlingWithHTTPS is the case where an HTTPS website has throttling configured for it. +func throttlingWithHTTPS() *TestCase { + return &TestCase{ + Name: "throttlingWithHTTPS", + Flags: TestCaseFlagNoV04, + Input: "https://largefile.com/", + Configure: func(env *netemx.QAEnv) { + + env.DPIEngine().AddRule(&netem.DPIThrottleTrafficForTLSSNI{ + Delay: 300 * time.Millisecond, + Logger: log.Log, + PLR: 0.1, + SNI: "largefile.com", + }) + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "consistent", + HTTPExperimentFailure: "generic_timeout_error", + XBlockingFlags: 8, // AnalysisBlockingFlagHTTPBlocking + Accessible: false, + Blocking: "http-failure", + }, + } +} diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis.json new file mode 100644 index 0000000000..ddc9bbde88 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis.json @@ -0,0 +1,690 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1, + 2, + 3 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1, + 2, + 3 + ], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 1, + 2, + 3 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [ + 5 + ], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "35.161.85.189:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 7, + "TagFetchBody": false, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 6, + "TagFetchBody": false, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 1, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "52.35.36.75:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis_classic.json new file mode 100644 index 0000000000..8370a1ebbf --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/analysis_classic.json @@ -0,0 +1,266 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 3 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 3 + ], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 3 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [ + 5 + ], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "35.161.85.189:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 1, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "52.35.36.75:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/measurement.json new file mode 100644 index 0000000000..5a64eac6eb --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/measurement.json @@ -0,0 +1,1599 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://largefile.com/", + "measurement_start_time": "2024-02-05 19:35:59", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.21.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "35.161.85.189:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.032752, + "t": 0.037581, + "transaction_id": 7, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "address": "52.35.36.75:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.032795, + "t": 0.037913, + "transaction_id": 6, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 2286, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.046092, + "t": 0.046092, + "transaction_id": 7, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "address": "52.35.36.75:443", + "failure": null, + "num_bytes": 2286, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.046424, + "t": 0.046424, + "transaction_id": 6, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.032789, + "t": 0.639151, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.639207, + "t": 0.639207, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "52.35.36.75:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.032792, + "t": 0.646806, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 4096, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.4209990000000001, + "t": 1.4209990000000001, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 4096, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.728991, + "t": 1.728991, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 4096, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.762203, + "t": 1.762203, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.123442, + "t": 2.123442, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.474369, + "t": 2.474369, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.6458909999999998, + "t": 2.6458909999999998, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.9105119999999998, + "t": 2.9105119999999998, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.976681, + "t": 2.976681, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.105701, + "t": 3.105701, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.296275, + "t": 3.296275, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.4323420000000002, + "t": 3.4323420000000002, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.860347, + "t": 3.860347, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.885411, + "t": 3.885411, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.021281, + "t": 4.021281, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.581676, + "t": 4.581676, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.644627, + "t": 4.644627, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.841864, + "t": 4.841864, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.866874, + "t": 4.866874, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.071969, + "t": 5.071969, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.162655, + "t": 5.162655, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.353474, + "t": 5.353474, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.423338, + "t": 5.423338, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.469378, + "t": 5.469378, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.630689, + "t": 5.630689, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.909603, + "t": 5.909603, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.953989, + "t": 5.953989, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.984516, + "t": 5.984516, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.192532, + "t": 6.192532, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.312315, + "t": 6.312315, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.74671, + "t": 6.74671, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.938089, + "t": 6.938089, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.963108, + "t": 6.963108, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.988115, + "t": 6.988115, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.013624, + "t": 7.013624, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.038631, + "t": 7.038631, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.287396, + "t": 7.287396, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.38491, + "t": 7.38491, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.886756, + "t": 7.886756, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.536787, + "t": 8.536787, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.563, + "t": 8.563, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.213013, + "t": 9.213013, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.293385, + "t": 9.293385, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.943405, + "t": 9.943405, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.968412, + "t": 9.968412, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.022805, + "t": 10.022805, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.053388, + "t": 10.053388, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.483361, + "t": 10.483361, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 10.639104, + "t": 10.639104, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:80", + "failure": null, + "num_bytes": 17128, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.639249, + "t": 10.639249, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000582, + "t": 0.000582, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.007294, + "t": 0.013071, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.013121, + "t": 0.013121, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 292, + "operation": "write", + "proto": "tcp", + "t0": 0.013362, + "t": 0.013374, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.013377, + "t": 0.020151, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 872, + "operation": "read", + "proto": "tcp", + "t0": 0.020313, + "t": 0.020314, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 845, + "operation": "read", + "proto": "tcp", + "t0": 0.020315, + "t": 0.020384, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.021154, + "t": 0.021162, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.021165, + "t": 0.021165, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 396, + "operation": "write", + "proto": "tcp", + "t0": 0.021304, + "t": 0.02136, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 226, + "operation": "read", + "proto": "tcp", + "t0": 0.021245, + "t": 0.02686, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 396, + "operation": "write", + "proto": "tcp", + "t0": 0.026898, + "t": 0.026905, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 168, + "operation": "read", + "proto": "tcp", + "t0": 0.026886, + "t": 0.032525, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.032563, + "t": 0.032563, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "172.64.41.4:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.032569, + "t": 0.032605, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + } + ], + "queries": [ + { + "answers": [ + { + "asn": 13335, + "as_org_name": "Cloudflare Inc", + "answer_type": "A", + "ipv4": "172.64.41.4", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "mozilla.cloudflare-dns.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001523, + "t": 0.007185, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "172.64.41.4", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.007294, + "t": 0.013071, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "172.64.41.4:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDiDCCAnCgAwIBAgIUdIRJkKFAB5VgmEp9WUt9nhpFzfkwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA1MTgzNTU5WhcNMjQwMjA1MjAzNTU5WjA9MRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMSMwIQYDVQQDExptb3ppbGxhLmNsb3VkZmxhcmUtZG5zLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK5NNeVwsBz8EzIs9bTwlFLPUfg7vUvHuzutCJcO6yJBDDKDPFeRsaDqhtcaOjOw7fxBMimah1zOyhsw65f0YRsUd6PKEVIqgNm3+WJEJQ3eobB9QqYq0O7ckCm2QEsLaeGuSBMwDn/m8RXAbSAQxA2hPR6lY0jel2RrfqWqph4A+P5C7fkvrAScjV8yFsa50eERFR30hTQGnlkLGeeVX3bB8OZnuDBYLygZg7VDsoiGWfdRoYvl1Qh3hVtvlapMlXtFZK50IKwTGVFdDWJO7IdyTSMixGB8aN3xIB8pn22oVB8Lr5yllO9RB1HEs9DK/6KS+fdNPG4m3I7qJ28dT78CAwEAAaOBnTCBmjAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUXvwH5nepfWVMWo5wjLn0rEwnpEMwHwYDVR0jBBgwFoAUBqcd8PQNXTXdLe4yCNgd9XVGIzIwJQYDVR0RBB4wHIIabW96aWxsYS5jbG91ZGZsYXJlLWRucy5jb20wDQYJKoZIhvcNAQELBQADggEBABwoS1XC/+18ko7kqJSLaZu8/mfKrIQCP86neHe+aERu8pt+fjH64RGj3/3/iCK3w4dE7V1Jmr+S3b09fIqR0fJ1KxEbihuaBKQHeBAsyMOpZ3mhqSwZOi+qbMSrKiGf3eRHRrILKdfSxfCxm4HfWAsdkufzt0QDOrTizxoHRN5j63H4L/mgEvnDVTJMbeGbfv7tG3N8Ca4U9Fo8sBJU7KD6LgGp3Rod37PCZZr40L/6u8ofEpBW75ZnhUxYxkuUJJl4Qs7gSMvYO5Rcyu2pNo/w4B4FgqUvbw9j7RSW73jiEbcyzdt+2IPAoLi/7x2BfJcufgzmiUHF/GNC2MIB3Oc=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUaEvM5lDU2E2owmcWHoI17uG8zakwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA0MTkzNTU5WhcNMjQwMjA2MTkzNTU5WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJQfMY/ls9VpORSZg4w56OBV1un9bAarBe01fPYME+DzyNI0OXqazfiAhmn9vPuFIvNaVheBinxzKZWb84lTqV/YptiuLR7xuEtAq1dbaWGf1+Xk1wuW2M5ZBvZACZFIVUG9qSiAU+Hfwd8StwGIHtDcXbPYT1zcN855QO+7F6LER7oTwG1IfRCfpx/m9zETfxgQHA+Udwxy++lJPgOWlhdyp9S4Gh5Rl3gnoihLs7qogqfL3CvFKV0q1INgZkjO2ImnlBw11Wr6BUYqXASOxJLz8YveU/Zq5Mi8k6fSSnD1hku3tLXFOcOmil/9qro60jXRq/pyXJDCP7Xb7lHstGsCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAanHfD0DV013S3uMgjYHfV1RiMyMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQBdRF1VQxSoUCvj+xGuP48yQQXOG1OgV3BQqG/XzxsmAa+KMQ5LKmR9MqQ5FHr6zW1uNzj22ZcHcjAJscaKC98vlrcSPNPNlo1BstxZDWNjohaANWIihU2m15saafhpSfdp1rkZw/Vs2SijMdirFTrFSV96GqzZNr94HGCHiNvLz7pEt8RuPh9mDJlgfdA6N+T94lZcAGcMED0n90e7VnSS3XzS7Q1QZa7c4OSKokk8p7iQ+mYhwnQfnfVDKBUfoi+lgioXIBZ73ppzxwD2htAZdDUwwPZ1srz1UqMu4a8zAZMnRUnj5Y/mC6adpvXLnPPBIbhsSz4Y84LZgYCICEeT", + "format": "base64" + } + ], + "server_name": "mozilla.cloudflare-dns.com", + "t0": 0.013121, + "t": 0.021165, + "tags": [ + "depth=0" + ], + "tls_version": "TLSv1.3", + "transaction_id": 1 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000564, + "t": 0.000564, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "udp", + "t0": 0.000817, + "t": 0.000828, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "udp", + "t0": 0.000849, + "t": 0.001173, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 89, + "operation": "read", + "proto": "udp", + "t0": 0.000832, + "t": 0.00647, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "read", + "proto": "udp", + "t0": 0.001195, + "t": 0.007777, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.007813, + "t": 0.007813, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "52.35.36.75", + "ttl": null + }, + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "35.161.85.189", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "largefile.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000587, + "t": 0.006826, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "52.35.36.75", + "ttl": null + }, + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "35.161.85.189", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "largefile.com", + "query_type": "A", + "raw_response": "iwiBAAABAAIAAAAACWxhcmdlZmlsZQNjb20AAAEAAQlsYXJnZWZpbGUDY29tAAABAAEAAA4QAAQ0IyRLCWxhcmdlZmlsZQNjb20AAAEAAQAADhAABCOhVb0=", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.0006, + "t": 0.006495, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "largefile.com", + "query_type": "AAAA", + "raw_response": "gqqBAAABAAAAAAAACWxhcmdlZmlsZQNjb20AABwAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000578, + "t": 0.00778, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "52.35.36.75", + "ttl": null + }, + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "35.161.85.189", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "largefile.com", + "query_type": "A", + "raw_response": "n9KBAAABAAIAAAAACWxhcmdlZmlsZQNjb20AAAEAAQlsYXJnZWZpbGUDY29tAAABAAEAAA4QAAQ0IyRLCWxhcmdlZmlsZQNjb20AAAEAAQAADhAABCOhVb0=", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://mozilla.cloudflare-dns.com/dns-query", + "t0": 0.000632, + "t": 0.026891, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "largefile.com", + "query_type": "AAAA", + "raw_response": "sOGBAAABAAAAAAAACWxhcmdlZmlsZQNjb20AABwAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://mozilla.cloudflare-dns.com/dns-query", + "t0": 0.000706, + "t": 0.032549, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "35.161.85.189:80", + "failure": "generic_timeout_error", + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "largefile.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.3" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "largefile.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.3" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "http://largefile.com/" + }, + "response": { + "body": { + "data": "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", + "format": "base64" + }, + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Type", + "application/octet-stream" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Type": "application/octet-stream", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.639207, + "t": 10.639104, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 5 + } + ], + "tcp_connect": [ + { + "ip": "35.161.85.189", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.032752, + "t": 0.037581, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "transaction_id": 7 + }, + { + "ip": "52.35.36.75", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.032795, + "t": 0.037913, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "transaction_id": 6 + }, + { + "ip": "35.161.85.189", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.032789, + "t": 0.639151, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 5 + }, + { + "ip": "52.35.36.75", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.032792, + "t": 0.646806, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "35.161.85.189:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDgTCCAmmgAwIBAgIUOERNIx9e0UIoViDcQ0pJrar9OeAwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA1MTgzNTU5WhcNMjQwMjA1MjAzNTU5WjAwMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRYwFAYDVQQDEw1sYXJnZWZpbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArk015XCwHPwTMiz1tPCUUs9R+Du9S8e7O60Ilw7rIkEMMoM8V5GxoOqG1xo6M7Dt/EEyKZqHXM7KGzDrl/RhGxR3o8oRUiqA2bf5YkQlDd6hsH1CpirQ7tyQKbZASwtp4a5IEzAOf+bxFcBtIBDEDaE9HqVjSN6XZGt+paqmHgD4/kLt+S+sBJyNXzIWxrnR4REVHfSFNAaeWQsZ55VfdsHw5me4MFgvKBmDtUOyiIZZ91Ghi+XVCHeFW2+VqkyVe0VkrnQgrBMZUV0NYk7sh3JNIyLEYHxo3fEgHymfbahUHwuvnKWU71EHUcSz0Mr/opL59008bibcjuonbx1PvwIDAQABo4GjMIGgMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRe/Afmd6l9ZUxajnCMufSsTCekQzAfBgNVHSMEGDAWgBQGpx3w9A1dNd0t7jII2B31dUYjMjArBgNVHREEJDAigg1sYXJnZWZpbGUuY29tghF3d3cubGFyZ2VmaWxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAdn2PlrqGFAOCdyOMtCQwjFmOpD86yfsZ5+IFedl98phmogVurKI4YXI0fF7flon96dugjcM2UwfvooVgIU9Z6Cgy8VxjuTH59tZuxppa7bFrcRzhBFv+fUL20tAQCDvtqMZvVsTwaeiNfprZfakDkMdNpOltlOJTduEEDFCJH/0EoMhCnmwWLVQmw8nzGZ1WNYkkX1e7quJLe3rt07Yjs++6bGmWwIe11fx6VwSjSUUxZQZMjfV8KAlDyNVD6RlG3v7J2JU6Lesyz/WY2d0Va0KbKSztjFCkivsReKIStKEgNrnxCJ0P3NzXOfNFQX+Ieos/7TrmWNcsFRvWlKY7Iw==", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUaEvM5lDU2E2owmcWHoI17uG8zakwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA0MTkzNTU5WhcNMjQwMjA2MTkzNTU5WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJQfMY/ls9VpORSZg4w56OBV1un9bAarBe01fPYME+DzyNI0OXqazfiAhmn9vPuFIvNaVheBinxzKZWb84lTqV/YptiuLR7xuEtAq1dbaWGf1+Xk1wuW2M5ZBvZACZFIVUG9qSiAU+Hfwd8StwGIHtDcXbPYT1zcN855QO+7F6LER7oTwG1IfRCfpx/m9zETfxgQHA+Udwxy++lJPgOWlhdyp9S4Gh5Rl3gnoihLs7qogqfL3CvFKV0q1INgZkjO2ImnlBw11Wr6BUYqXASOxJLz8YveU/Zq5Mi8k6fSSnD1hku3tLXFOcOmil/9qro60jXRq/pyXJDCP7Xb7lHstGsCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAanHfD0DV013S3uMgjYHfV1RiMyMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQBdRF1VQxSoUCvj+xGuP48yQQXOG1OgV3BQqG/XzxsmAa+KMQ5LKmR9MqQ5FHr6zW1uNzj22ZcHcjAJscaKC98vlrcSPNPNlo1BstxZDWNjohaANWIihU2m15saafhpSfdp1rkZw/Vs2SijMdirFTrFSV96GqzZNr94HGCHiNvLz7pEt8RuPh9mDJlgfdA6N+T94lZcAGcMED0n90e7VnSS3XzS7Q1QZa7c4OSKokk8p7iQ+mYhwnQfnfVDKBUfoi+lgioXIBZ73ppzxwD2htAZdDUwwPZ1srz1UqMu4a8zAZMnRUnj5Y/mC6adpvXLnPPBIbhsSz4Y84LZgYCICEeT", + "format": "base64" + } + ], + "server_name": "largefile.com", + "t0": 0.037607, + "t": 0.046054, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "tls_version": "TLSv1.3", + "transaction_id": 7 + }, + { + "network": "tcp", + "address": "52.35.36.75:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDgTCCAmmgAwIBAgIUSmJTa/opgI8t4BklczoCxlwvACAwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA1MTgzNTU5WhcNMjQwMjA1MjAzNTU5WjAwMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRYwFAYDVQQDEw1sYXJnZWZpbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArk015XCwHPwTMiz1tPCUUs9R+Du9S8e7O60Ilw7rIkEMMoM8V5GxoOqG1xo6M7Dt/EEyKZqHXM7KGzDrl/RhGxR3o8oRUiqA2bf5YkQlDd6hsH1CpirQ7tyQKbZASwtp4a5IEzAOf+bxFcBtIBDEDaE9HqVjSN6XZGt+paqmHgD4/kLt+S+sBJyNXzIWxrnR4REVHfSFNAaeWQsZ55VfdsHw5me4MFgvKBmDtUOyiIZZ91Ghi+XVCHeFW2+VqkyVe0VkrnQgrBMZUV0NYk7sh3JNIyLEYHxo3fEgHymfbahUHwuvnKWU71EHUcSz0Mr/opL59008bibcjuonbx1PvwIDAQABo4GjMIGgMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRe/Afmd6l9ZUxajnCMufSsTCekQzAfBgNVHSMEGDAWgBQGpx3w9A1dNd0t7jII2B31dUYjMjArBgNVHREEJDAigg1sYXJnZWZpbGUuY29tghF3d3cubGFyZ2VmaWxlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAdhIlbI+TS/Zj1nSLqs6KLQE1SvyduaIblCeYQDtoNbC+AzzQ5B3PzXy+eQ15wr5JKTKO1B4v3AFRVi2GQlhM3CyJkth0NFiLRq8UHOYa+U07upC0900Mt4k5KNjIVsHUoW95aaQJZAGpjcCwF8PZx2NL8OY0I2a7kP293VXZM6kpEATbjWXme1RhrnNQzrBmbQ3k0dGbniB+gurvAHuW20cYFexExYwbFe7bYw2jVLLGZmrxH20c7Utn709qRplETHwkqpqwz7z6nNLaxqd33YRC0IAdEmpAlsVzEWMgAT3tekz/1etzF5xDzrH9X4xsZjbr+DdjHwvlccR/o7xVAA==", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUaEvM5lDU2E2owmcWHoI17uG8zakwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA0MTkzNTU5WhcNMjQwMjA2MTkzNTU5WjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJQfMY/ls9VpORSZg4w56OBV1un9bAarBe01fPYME+DzyNI0OXqazfiAhmn9vPuFIvNaVheBinxzKZWb84lTqV/YptiuLR7xuEtAq1dbaWGf1+Xk1wuW2M5ZBvZACZFIVUG9qSiAU+Hfwd8StwGIHtDcXbPYT1zcN855QO+7F6LER7oTwG1IfRCfpx/m9zETfxgQHA+Udwxy++lJPgOWlhdyp9S4Gh5Rl3gnoihLs7qogqfL3CvFKV0q1INgZkjO2ImnlBw11Wr6BUYqXASOxJLz8YveU/Zq5Mi8k6fSSnD1hku3tLXFOcOmil/9qro60jXRq/pyXJDCP7Xb7lHstGsCAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFAanHfD0DV013S3uMgjYHfV1RiMyMBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQBdRF1VQxSoUCvj+xGuP48yQQXOG1OgV3BQqG/XzxsmAa+KMQ5LKmR9MqQ5FHr6zW1uNzj22ZcHcjAJscaKC98vlrcSPNPNlo1BstxZDWNjohaANWIihU2m15saafhpSfdp1rkZw/Vs2SijMdirFTrFSV96GqzZNr94HGCHiNvLz7pEt8RuPh9mDJlgfdA6N+T94lZcAGcMED0n90e7VnSS3XzS7Q1QZa7c4OSKokk8p7iQ+mYhwnQfnfVDKBUfoi+lgioXIBZ73ppzxwD2htAZdDUwwPZ1srz1UqMu4a8zAZMnRUnj5Y/mC6adpvXLnPPBIbhsSz4Y84LZgYCICEeT", + "format": "base64" + } + ], + "server_name": "largefile.com", + "t0": 0.037932, + "t": 0.046394, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "tls_version": "TLSv1.3", + "transaction_id": 6 + } + ], + "x_control_request": { + "http_request": "http://largefile.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.3" + ] + }, + "tcp_connect": [ + "52.35.36.75:443", + "52.35.36.75:80", + "35.161.85.189:443", + "35.161.85.189:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "35.161.85.189:443": { + "status": true, + "failure": null + }, + "35.161.85.189:80": { + "status": true, + "failure": null + }, + "52.35.36.75:443": { + "status": true, + "failure": null + }, + "52.35.36.75:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "35.161.85.189:443": { + "server_name": "largefile.com", + "status": true, + "failure": null + }, + "52.35.36.75:443": { + "server_name": "largefile.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 16777216, + "discovered_h3_endpoint": "largefile.com:443", + "failure": null, + "title": "", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Type": "application/octet-stream", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "52.35.36.75", + "35.161.85.189" + ] + }, + "ip_info": { + "35.161.85.189": { + "asn": 16509, + "flags": 11 + }, + "52.35.36.75": { + "asn": 16509, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:52.35.36.75 Flags:7} {Addr:35.161.85.189 Flags:7}]", + "t": 0.032656 + }, + { + "msg": "conn 35.161.85.189:80: granted permission: true", + "t": 0.639167 + }, + { + "msg": "conn 52.35.36.75:80: denied permission: timed out sending", + "t": 0.656834 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": "generic_timeout_error", + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 10.639459, + "test_start_time": "2024-02-05 19:35:59", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations.json new file mode 100644 index 0000000000..cb2c873caf --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations.json @@ -0,0 +1,645 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "KnownTCPEndpoints": { + "4": { + "TagDepth": 0, + "Type": 1, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "52.35.36.75:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "5": { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "35.161.85.189:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "6": { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 6, + "TagFetchBody": false, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 6, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "7": { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 7, + "TagFetchBody": false, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations_classic.json new file mode 100644 index 0000000000..81a7c44ccf --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTP/observations_classic.json @@ -0,0 +1,226 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "KnownTCPEndpoints": { + "4": { + "TagDepth": 0, + "Type": 1, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "52.35.36.75:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "5": { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 3, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "35.161.85.189:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis.json new file mode 100644 index 0000000000..59dd181a8c --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis.json @@ -0,0 +1,425 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1, + 2 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1, + 2 + ], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 1, + 2 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [ + 4 + ], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": "https://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis_classic.json new file mode 100644 index 0000000000..0ec6b6150e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/analysis_classic.json @@ -0,0 +1,267 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1, + 2 + ], + "DNSLookupSuccessWithBogonAddresses": [], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 1 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [ + 4 + ], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": "https://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/measurement.json new file mode 100644 index 0000000000..9e33104630 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/measurement.json @@ -0,0 +1,1055 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://largefile.com/", + "measurement_start_time": "2024-02-05 19:36:10", + "probe_asn": "AS137", + "probe_cc": "IT", + "probe_ip": "127.0.0.1", + "probe_network_name": "Consortium GARR", + "report_id": "", + "resolver_asn": "AS137", + "resolver_ip": "130.192.3.21", + "resolver_network_name": "Consortium GARR", + "software_name": "ooniprobe", + "software_version": "3.21.0-alpha", + "test_helpers": { + "backend": { + "address": "https://0.th.ooni.org/", + "type": "https" + } + }, + "test_keys": { + "agent": "redirect", + "client_resolver": "", + "retries": null, + "socksproxy": null, + "network_events": [ + { + "address": "52.35.36.75:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.01199, + "t": 0.016968, + "transaction_id": 3, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.012013, + "t": 0.017196, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.62632, + "t": 0.62632, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 2287, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.638299, + "t": 0.638299, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "52.35.36.75:443", + "failure": null, + "num_bytes": 2287, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.64726, + "t": 0.64726, + "transaction_id": 3, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 2287, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.806478, + "t": 0.806478, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 2287, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.901232, + "t": 0.901232, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.403292, + "t": 1.403292, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.6003500000000002, + "t": 1.6003500000000002, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.691477, + "t": 1.691477, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 1.897203, + "t": 1.897203, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.436711, + "t": 2.436711, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 2.484867, + "t": 2.484867, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 3495, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.058387, + "t": 3.058387, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 6449, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 3.708394, + "t": 3.708394, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.318096, + "t": 4.318096, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.438772, + "t": 4.438772, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 4.80863, + "t": 4.80863, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.007526, + "t": 5.007526, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.416713, + "t": 5.416713, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 5.875043, + "t": 5.875043, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 9345, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.00097, + "t": 6.00097, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 14111, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.452244, + "t": 6.452244, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 14111, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.565978, + "t": 6.565978, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 14111, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.613514, + "t": 6.613514, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 14111, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.788515, + "t": 6.788515, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 17167, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.81632, + "t": 6.81632, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 17167, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 6.852882, + "t": 6.852882, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 17167, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.2915659999999995, + "t": 7.2915659999999995, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 7.474597, + "t": 7.474597, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.012053, + "t": 8.012053, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.256862, + "t": 8.256862, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.383991, + "t": 8.383991, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 8.712821, + "t": 8.712821, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 21511, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.18643, + "t": 9.18643, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 22959, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.661956, + "t": 9.661956, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 22959, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.691523, + "t": 9.691523, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 22959, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 9.787258, + "t": 9.787258, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 22959, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.214895, + "t": 10.214895, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 10.626212, + "t": 10.626212, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "35.161.85.189:443", + "failure": null, + "num_bytes": 22959, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 10.626325, + "t": 10.626325, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + } + ], + "x_dns_whoami": { + "system_v4": null, + "udp_v4": { + "8.8.4.4:53": null + } + }, + "x_doh": { + "network_events": [], + "queries": [], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000066, + "t": 0.000066, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "udp", + "t0": 0.000145, + "t": 0.000169, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "write", + "proto": "udp", + "t0": 0.000188, + "t": 0.000203, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 31, + "operation": "read", + "proto": "udp", + "t0": 0.000185, + "t": 0.005432, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 89, + "operation": "read", + "proto": "udp", + "t0": 0.000219, + "t": 0.006145, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006193, + "t": 0.006193, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "largefile.com", + "query_type": "AAAA", + "raw_response": "3SqBAAABAAAAAAAACWxhcmdlZmlsZQNjb20AABwAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000076, + "t": 0.005438, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "52.35.36.75", + "ttl": null + }, + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "35.161.85.189", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "largefile.com", + "query_type": "A", + "raw_response": "y7OBAAABAAIAAAAACWxhcmdlZmlsZQNjb20AAAEAAQlsYXJnZWZpbGUDY29tAAABAAEAAA4QAAQ0IyRLCWxhcmdlZmlsZQNjb20AAAEAAQAADhAABCOhVb0=", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000093, + "t": 0.006149, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": [ + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "52.35.36.75", + "ttl": null + }, + { + "asn": 16509, + "as_org_name": "Amazon.com, Inc.", + "answer_type": "A", + "ipv4": "35.161.85.189", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "largefile.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.00007, + "t": 0.006264, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "requests": [ + { + "network": "tcp", + "address": "35.161.85.189:443", + "alpn": "http/1.1", + "failure": "generic_timeout_error", + "request": { + "body": "", + "body_is_truncated": false, + "headers_list": [ + [ + "Accept", + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + [ + "Accept-Language", + "en-US,en;q=0.9" + ], + [ + "Host", + "largefile.com" + ], + [ + "Referer", + "" + ], + [ + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.3" + ] + ], + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.9", + "Host": "largefile.com", + "Referer": "", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[scrubbed] Safari/537.3" + }, + "method": "GET", + "tor": { + "exit_ip": null, + "exit_name": null, + "is_tor": false + }, + "x_transport": "tcp", + "url": "https://largefile.com/" + }, + "response": { + "body": { + "data": "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", + "format": "base64" + }, + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Type", + "application/octet-stream" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Type": "application/octet-stream", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.62632, + "t": 10.626212, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 4 + } + ], + "tcp_connect": [ + { + "ip": "52.35.36.75", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.01199, + "t": 0.016968, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 3 + }, + { + "ip": "35.161.85.189", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.012013, + "t": 0.017196, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "35.161.85.189:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDgjCCAmqgAwIBAgIVAJxPfjD/6oBhuJbYWfO2vGoZriABMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDIwNTE4MzYxMFoXDTI0MDIwNTIwMzYxMFowMDEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEWMBQGA1UEAxMNbGFyZ2VmaWxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMxESPBQ2bg12VYw1weJXb1M73+X1CyATPL9g39TMW+Lf8hFUDfHxT5qVHxIu9MZ6aA5rNy/Kj+ZXS06hlLV2NlyTa7M32AlDiSYW22KgUdHhnStnL4dz8mVOs1aOud5gF7TK4jIJp+uXusjEfzHntcK1OFinAyIFqIYcogZJCrjl++kVZ4dPlPNs+V7b0CNhFYVd+0hvCi2Xm7EiWu21RgXXUytHGZNB3skqNIS2NcE3KlTPvTd/0776PVnbVQTR4AQ7PPdCJls1ykMRhrvE8A73BDtRBpH/A7i4g/m0RgaklbfOc/KHNVPywO9TqS0qNMtOMzatbh0EgVZP/mRP6cCAwEAAaOBozCBoDAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU9naMHCjJMlHP1p4Aww6a0wQ32vswHwYDVR0jBBgwFoAUzY9LqQoIekiRA4VTpkiMdr/NWrUwKwYDVR0RBCQwIoINbGFyZ2VmaWxlLmNvbYIRd3d3LmxhcmdlZmlsZS5jb20wDQYJKoZIhvcNAQELBQADggEBAAz0XQOAth0KG4ge5rRIeZxVkpRGlCFOkRmqH+MSm4qLNLdYNeeeWthB09TyLvtuwzmYqBWJ8QBNkWrufrl96pJZbk/jsiHrUoLnXauclbKY/CQlStaBMGCJYrpkMq5m7n1p5PbjbMfnr28R3/PIa6LfaGbioX2l5KUDQaixXofh53xUSmBLAYY6CHool1S+OPnzuVBVbk/S9gZwfbrxntv/EQg8hrHlCmVBR6sP+ks99aHIzHh5ybvwK/rnTqiHkdQ/54RlL44+ORlDt91o2aEDRAu6D8aArXmVe7LQWs+yDsTea3fn7if4eoQ+0xrqq/PG+CMIWTGqtOsh9ypQLFk=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUHol+P97swxT7A5mkEUkOqZpKPLQwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA0MTkzNjEwWhcNMjQwMjA2MTkzNjEwWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJf01bGMk5AaOV3BuwU7alRR9cx/OTTF+X+wl4iFDlyK4biBWoSEcKPsvUrXh3Ar/H48amwXM58OSamlI0SC3/BiFXkD6WrmcX8xi1OzbxhsWh+i3s2G8WmqOJ6lrgYI6vfW281pcG0KD2m3MSjApiNUlzK828NdLgRaPMkhbdWf/dme1jLJNjwzJ5pyhXaUcmCaN5aS5XGDnZVkLGQvYMD0J8VQYTDzD0YTy3GJJ4Kr/gpEAy3asTbmJ70ajqwk6hD053Yh5i+AgY0mPlITyEH/uwSa+W4mo8fAg4dBZ8c+//jVwEI6YCQjEDFd7i15ni+BaUSSuCgUCyW/xFYiL/8CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFM2PS6kKCHpIkQOFU6ZIjHa/zVq1MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQA45d4YzUt1jh1sUnhA8vEUTuZnYo/TSLi/Rcyi5oFUo48ypYvTg4PJkqpYj/PNb1qHRG7EfRqQ76Ok2FURhJhojtV34e1ceQnhwiU4MaokqewpsMwKceW778dkqCKgIrWX/Kv981kQaf8+SR1yUI8u+KEJ5GvD4wpITCovhyOHUuZKrsYRxVTZpHPn3dPQLJlq6tOfA9wzCwzfsJWzEygC31E7wyJHScFg4nyJkn/mN6VclJfL5ExlUodgOmOekkhcljsayLsbnQVWuzKRRaTNCl5zz/aTmRmKceTVPjWRK2q8efv3eiVVbIJg/Yyb29BBURQHOYamZBDwH39UFWX9", + "format": "base64" + } + ], + "server_name": "largefile.com", + "t0": 0.017206, + "t": 0.626243, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "tls_version": "TLSv1.3", + "transaction_id": 4 + }, + { + "network": "tcp", + "address": "52.35.36.75:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDgjCCAmqgAwIBAgIVAOc6SVOrqcmrFn4exXvFkW6Ucv3hMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDIwNTE4MzYxMFoXDTI0MDIwNTIwMzYxMFowMDEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEWMBQGA1UEAxMNbGFyZ2VmaWxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMxESPBQ2bg12VYw1weJXb1M73+X1CyATPL9g39TMW+Lf8hFUDfHxT5qVHxIu9MZ6aA5rNy/Kj+ZXS06hlLV2NlyTa7M32AlDiSYW22KgUdHhnStnL4dz8mVOs1aOud5gF7TK4jIJp+uXusjEfzHntcK1OFinAyIFqIYcogZJCrjl++kVZ4dPlPNs+V7b0CNhFYVd+0hvCi2Xm7EiWu21RgXXUytHGZNB3skqNIS2NcE3KlTPvTd/0776PVnbVQTR4AQ7PPdCJls1ykMRhrvE8A73BDtRBpH/A7i4g/m0RgaklbfOc/KHNVPywO9TqS0qNMtOMzatbh0EgVZP/mRP6cCAwEAAaOBozCBoDAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU9naMHCjJMlHP1p4Aww6a0wQ32vswHwYDVR0jBBgwFoAUzY9LqQoIekiRA4VTpkiMdr/NWrUwKwYDVR0RBCQwIoINbGFyZ2VmaWxlLmNvbYIRd3d3LmxhcmdlZmlsZS5jb20wDQYJKoZIhvcNAQELBQADggEBAJCO8I6omF+XtrKhmYi7TLymQHBvzuCYtBtmg389ej5wYQaObYJd3nV/37kkbQeTc9ojw1GaRKjXKwJPzE3vCvmHQDDvKfOmDiOGRzbejfzGuFgL3g+ux8bzBQYL93u9mwJUXWtN0ck4VepaicJlHv2/LZHhElxcxoq15eexylFuJdv1t/BiUeARGM4vod3ATo9fLrD+ZJT9JJ866ZV4zGGCKf605ijyoVCj7KU8m1YoweVbGO+21RipgMXwZdw5Kav88oKEtiYwdfLKo+i8ZCyYF1ODo+7pHxnuSkQNiwClwhV5Wx3L7VZaj9ZguVPVbWqQ2ZxJ5nT1kkuK3lLskS4=", + "format": "base64" + }, + { + "data": "MIIDNTCCAh2gAwIBAgIUHol+P97swxT7A5mkEUkOqZpKPLQwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMjA0MTkzNjEwWhcNMjQwMjA2MTkzNjEwWjAfMQ0wCwYDVQQKEwRPT05JMQ4wDAYDVQQDEwVqYWZhcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJf01bGMk5AaOV3BuwU7alRR9cx/OTTF+X+wl4iFDlyK4biBWoSEcKPsvUrXh3Ar/H48amwXM58OSamlI0SC3/BiFXkD6WrmcX8xi1OzbxhsWh+i3s2G8WmqOJ6lrgYI6vfW281pcG0KD2m3MSjApiNUlzK828NdLgRaPMkhbdWf/dme1jLJNjwzJ5pyhXaUcmCaN5aS5XGDnZVkLGQvYMD0J8VQYTDzD0YTy3GJJ4Kr/gpEAy3asTbmJ70ajqwk6hD053Yh5i+AgY0mPlITyEH/uwSa+W4mo8fAg4dBZ8c+//jVwEI6YCQjEDFd7i15ni+BaUSSuCgUCyW/xFYiL/8CAwEAAaNpMGcwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFM2PS6kKCHpIkQOFU6ZIjHa/zVq1MBAGA1UdEQQJMAeCBWphZmFyMA0GCSqGSIb3DQEBCwUAA4IBAQA45d4YzUt1jh1sUnhA8vEUTuZnYo/TSLi/Rcyi5oFUo48ypYvTg4PJkqpYj/PNb1qHRG7EfRqQ76Ok2FURhJhojtV34e1ceQnhwiU4MaokqewpsMwKceW778dkqCKgIrWX/Kv981kQaf8+SR1yUI8u+KEJ5GvD4wpITCovhyOHUuZKrsYRxVTZpHPn3dPQLJlq6tOfA9wzCwzfsJWzEygC31E7wyJHScFg4nyJkn/mN6VclJfL5ExlUodgOmOekkhcljsayLsbnQVWuzKRRaTNCl5zz/aTmRmKceTVPjWRK2q8efv3eiVVbIJg/Yyb29BBURQHOYamZBDwH39UFWX9", + "format": "base64" + } + ], + "server_name": "largefile.com", + "t0": 0.016984, + "t": 0.637207, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "tls_version": "TLSv1.3", + "transaction_id": 3 + } + ], + "x_control_request": { + "http_request": "https://largefile.com/", + "http_request_headers": { + "Accept": [ + "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" + ], + "Accept-Language": [ + "en-US,en;q=0.9" + ], + "User-Agent": [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.3" + ] + }, + "tcp_connect": [ + "52.35.36.75:443", + "52.35.36.75:80", + "35.161.85.189:443", + "35.161.85.189:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "35.161.85.189:443": { + "status": true, + "failure": null + }, + "52.35.36.75:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "35.161.85.189:443": { + "server_name": "largefile.com", + "status": true, + "failure": null + }, + "52.35.36.75:443": { + "server_name": "largefile.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 16777216, + "discovered_h3_endpoint": "largefile.com:443", + "failure": null, + "title": "", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Type": "application/octet-stream", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "52.35.36.75", + "35.161.85.189" + ] + }, + "ip_info": { + "35.161.85.189": { + "asn": 16509, + "flags": 11 + }, + "52.35.36.75": { + "asn": 16509, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:52.35.36.75 Flags:3} {Addr:35.161.85.189 Flags:3}]", + "t": 0.011938 + }, + { + "msg": "conn 35.161.85.189:443: granted permission: true", + "t": 0.62627 + }, + { + "msg": "conn 52.35.36.75:443: denied permission: timed out sending", + "t": 0.647229 + } + ], + "control_failure": null, + "x_dns_flags": 0, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": "generic_timeout_error", + "x_blocking_flags": 8, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "http-failure", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 10.62643, + "test_start_time": "2024-02-05 19:36:10", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations.json new file mode 100644 index 0000000000..c0b12c4400 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations.json @@ -0,0 +1,383 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": null, + "IPAddressOrigin": null, + "IPAddress": null, + "IPAddressASN": null, + "IPAddressBogon": null, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "KnownTCPEndpoints": { + "3": { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "4": { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": "https://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations_classic.json new file mode 100644 index 0000000000..440b9d33e0 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/throttlingWithHTTPS/observations_classic.json @@ -0,0 +1,226 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": null, + "EndpointProto": null, + "EndpointPort": null, + "EndpointAddress": null, + "TCPConnectFailure": null, + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + ], + "KnownTCPEndpoints": { + "3": { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "52.35.36.75", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 3, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "52.35.36.75:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + }, + "4": { + "TagDepth": 0, + "Type": 3, + "Failure": "generic_timeout_error", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "largefile.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "IPAddressOrigin": "dns", + "IPAddress": "35.161.85.189", + "IPAddressASN": 16509, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "35.161.85.189:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "largefile.com", + "HTTPRequestURL": "https://largefile.com/", + "HTTPFailure": "generic_timeout_error", + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "largefile.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "35.161.85.189", + "52.35.36.75" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 16777216, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "35.161.85.189", + "52.35.36.75" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/netxlite/iox.go b/internal/netxlite/iox.go index 41b020d4d6..e526a2ed48 100644 --- a/internal/netxlite/iox.go +++ b/internal/netxlite/iox.go @@ -10,9 +10,6 @@ import ( "io" ) -// TODO(bassosimone): consider integrating StreamAllContext from -// internal/experiment/webconnectivity/iox.go - // ReadAllContext is like io.ReadAll but reads r in a // background goroutine. This function will return // earlier if the context is cancelled. In which case @@ -80,3 +77,105 @@ func CopyContext(ctx context.Context, dst io.Writer, src io.Reader) (int64, erro return 0, NewTopLevelGenericErrWrapper(err) } } + +// StreamAllContext streams from the given reader [r] until +// interrupted by [ctx] or when [r] hits the EOF. +// +// This function runs a background goroutine that should exit as soon +// as [ctx] is done or when [reader] is closed, if applicable. +// +// This function transforms an errors.Is(err, io.EOF) to a nil error +// such as the standard library's ReadAll does. +// +// The caller of this function MUST check for the context being +// expired when there's an error and decide what it is proper to +// do in such a case. Typically, when streaming the HTTP response +// body for Web Connectivity v0.5, the right thing to do is to +// report the body as being truncated. +// +// This function might return a non-zero-length buffer along with +// an non-nil error in the case in which we could only read a portion +// of the body and then we were interrupted by the error. +func StreamAllContext(ctx context.Context, reader io.Reader) ([]byte, error) { + data, err := streamAllContext(ctx, reader) + if err != nil { + err = NewTopLevelGenericErrWrapper(err) + } + return data, err +} + +// streamAllContext is the inner function invoked by [StreamAllContext]. +func streamAllContext(ctx context.Context, reader io.Reader) ([]byte, error) { + // create channels for communicating with inner goroutine. + datach, errch := make(chan []byte), make(chan error) + + // ensure we're able to notify the inner goroutine about cancellation. + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + go func() { + for { + // create buffer holding the next chunk of data. + // + // Implementation note: the buffer MUST be created at each + // loop, otherwise we're data-racing with the reader. + buffer := make([]byte, 1<<13) + + // issue the read proper + count, err := reader.Read(buffer) + + // handle the case where we have some data + // + // Note: it's legit to read some data _and_ receive an error + if count > 0 { + data := buffer[:count] + select { + case datach <- data: + // fallthrough to check error + case <-ctx.Done(): + return + } + } + + // handle the case of error + // + // Note: it's legit to read some data _and_ receive an error + if err != nil { + select { + case errch <- err: + return + case <-ctx.Done(): + return + } + } + } + }() + + // preallocate the result buffer to avoid frequent reallocations + resultbuf := make([]byte, 0, 1<<17) + + for { + select { + // case #1 - we received some data from the inner reader + case data := <-datach: + resultbuf = append(resultbuf, data...) + + // case #2 - error occurred, remember to deal w/ EOF + case err := <-errch: + if errors.Is(err, io.EOF) { + // see https://github.com/ooni/probe/issues/1965 + return resultbuf, nil + } + return resultbuf, err + + // case #3 - the context is done, goodbye! + case <-ctx.Done(): + // Historical implementation note: the original StreamAllContext + // implemented inside Web Connectivity v0.5 transformed the + // context.DeadlineExceeded error to nil. However, this is wrong + // because it prevents distinguishing real EOF and the case in + // which we timed out receiving from the socket. + return resultbuf, ctx.Err() + } + } +} diff --git a/internal/netxlite/iox_test.go b/internal/netxlite/iox_test.go index 687c35d893..5375c5aa8e 100644 --- a/internal/netxlite/iox_test.go +++ b/internal/netxlite/iox_test.go @@ -270,3 +270,133 @@ func TestCopyContext(t *testing.T) { wg.Wait() }) } + +func TestStreamAllContext(t *testing.T) { + t.Run("with success and background context", func(t *testing.T) { + r := strings.NewReader("deadbeef") + ctx := context.Background() + out, err := StreamAllContext(ctx, r) + if err != nil { + t.Fatal(err) + } + if len(out) != 8 { + t.Fatal("not the expected number of bytes") + } + }) + + t.Run("with success and wrapped io.EOF", func(t *testing.T) { + // See https://github.com/ooni/probe/issues/1965 + wg := &sync.WaitGroup{} + wg.Add(1) + r := &mocks.Reader{ + MockRead: func(b []byte) (int, error) { + defer wg.Done() + // "When Read encounters an error or end-of-file condition + // after successfully reading n > 0 bytes, it returns + // the number of bytes read. It may return the (non-nil) + // error from the same call or return the error (and n == 0) + // from a subsequent call."" + // + // See https://pkg.go.dev/io#Reader + // + // Note: Returning a wrapped error to ensure we address + // https://github.com/ooni/probe/issues/1965 + return len(b), NewErrWrapper(ClassifyGenericError, + ReadOperation, io.EOF) + }, + } + out, err := StreamAllContext(context.Background(), r) + if err != nil { + t.Fatal(err) + } + if len(out) <= 0 { + t.Fatal("we expected to see a positive number of bytes here") + } + wg.Wait() + }) + + t.Run("with failure and background context", func(t *testing.T) { + expected := errors.New("mocked error") + r := &mocks.Reader{ + MockRead: func(b []byte) (int, error) { + return 0, expected + }, + } + ctx := context.Background() + out, err := StreamAllContext(ctx, r) + if !errors.Is(err, expected) { + t.Fatal("not the error we expected", err) + } + var errWrapper *ErrWrapper + if !errors.As(err, &errWrapper) { + t.Fatal("the returned error is not wrapped") + } + if len(out) != 0 { + t.Fatal("not the expected number of bytes") + } + }) + + t.Run("with success and cancelled context", func(t *testing.T) { + wg := &sync.WaitGroup{} + wg.Add(1) + sigch := make(chan interface{}) + r := &mocks.Reader{ + MockRead: func(b []byte) (int, error) { + defer wg.Done() + <-sigch + // "When Read encounters an error or end-of-file condition + // after successfully reading n > 0 bytes, it returns + // the number of bytes read. It may return the (non-nil) + // error from the same call or return the error (and n == 0) + // from a subsequent call."" + // + // See https://pkg.go.dev/io#Reader + return len(b), io.EOF + }, + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() // fail immediately + out, err := StreamAllContext(ctx, r) + if !errors.Is(err, context.Canceled) { + t.Fatal("not the error we expected", err) + } + var errWrapper *ErrWrapper + if !errors.As(err, &errWrapper) { + t.Fatal("the returned error is not wrapped") + } + if len(out) != 0 { + t.Fatal("not the expected number of bytes") + } + close(sigch) + wg.Wait() + }) + + t.Run("with failure and cancelled context", func(t *testing.T) { + wg := &sync.WaitGroup{} + wg.Add(1) + sigch := make(chan interface{}) + expected := errors.New("mocked error") + r := &mocks.Reader{ + MockRead: func(b []byte) (int, error) { + defer wg.Done() + <-sigch + return 0, expected + }, + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() // fail immediately + out, err := StreamAllContext(ctx, r) + if !errors.Is(err, context.Canceled) { + t.Fatal("not the error we expected", err) + } + var errWrapper *ErrWrapper + if !errors.As(err, &errWrapper) { + t.Fatal("the returned error is not wrapped") + } + if len(out) != 0 { + t.Fatal("not the expected number of bytes") + } + close(sigch) + wg.Wait() + }) +}