From 9a75677537ec56e67377ab6f4138e9fd5c789353 Mon Sep 17 00:00:00 2001 From: Simone Basso Date: Wed, 24 Jan 2024 14:17:48 +0100 Subject: [PATCH] fix(webconnectivitylte): handle measurements with loopback addrs (#1462) This diff modifies webconnectivitylte and related packages to correctly handle measurements containing loopback addresses. There are two cases: (a) when both the probe and the TH only see loopback addresses at least for the getaddrinfo lookups; (b) when only the probe sees loopback addresses at least for the getaddrinfo lookups. In the former case, we should mark the website as "down" (maybe a little bit of a stretch, but if we mark down a website where the TLS is misconfigured, arguably we can do the same when DNS is misconfigured). In the latter case, we mark the measurement as censorship, since seeing a loopback address is not what we expect. Closes https://github.com/ooni/probe/issues/1517. --- .../webconnectivitylte/analysisclassic.go | 50 + .../analysisclassic_test.go | 44 + .../webconnectivitylte/analysisext.go | 11 +- .../webconnectivityqa/dnshijacking.go | 56 ++ .../experiment/webconnectivityqa/localhost.go | 49 + .../experiment/webconnectivityqa/testcase.go | 5 + internal/minipipeline/analysis.go | 6 +- internal/minipipeline/set.go | 4 +- .../analysis.json | 423 +++++++++ .../analysis_classic.json | 104 +++ .../measurement.json | 853 ++++++++++++++++++ .../observations.json | 372 ++++++++ .../observations_classic.json | 63 ++ .../analysis.json | 265 ++++++ .../analysis_classic.json | 104 +++ .../measurement.json | 550 +++++++++++ .../observations.json | 219 +++++ .../observations_classic.json | 63 ++ .../generated/localhostWithHTTP/analysis.json | 287 ++++++ .../localhostWithHTTP/analysis_classic.json | 99 ++ .../localhostWithHTTP/measurement.json | 551 +++++++++++ .../localhostWithHTTP/observations.json | 239 +++++ .../observations_classic.json | 58 ++ .../localhostWithHTTPS/analysis.json | 193 ++++ .../localhostWithHTTPS/analysis_classic.json | 99 ++ .../localhostWithHTTPS/measurement.json | 262 ++++++ .../localhostWithHTTPS/observations.json | 149 +++ .../observations_classic.json | 58 ++ 28 files changed, 5230 insertions(+), 6 deletions(-) create mode 100644 internal/experiment/webconnectivityqa/localhost.go create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis_classic.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/measurement.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations.json create mode 100644 internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations_classic.json diff --git a/internal/experiment/webconnectivitylte/analysisclassic.go b/internal/experiment/webconnectivitylte/analysisclassic.go index 2c687eab07..68a4534864 100644 --- a/internal/experiment/webconnectivitylte/analysisclassic.go +++ b/internal/experiment/webconnectivitylte/analysisclassic.go @@ -8,9 +8,12 @@ package webconnectivitylte // import ( + "net" + "github.com/ooni/probe-cli/v3/internal/geoipx" "github.com/ooni/probe-cli/v3/internal/minipipeline" "github.com/ooni/probe-cli/v3/internal/model" + "github.com/ooni/probe-cli/v3/internal/netxlite" "github.com/ooni/probe-cli/v3/internal/optional" "github.com/ooni/probe-cli/v3/internal/runtimex" ) @@ -375,5 +378,52 @@ func analysisClassicComputeBlockingAccessible(woa *minipipeline.WebAnalysis, tk tk.setHTTPExperimentFailure(entry.Failure) return } + + // 6. handle the case of DNS success with the probe only seeing loopback + // addrs while the TH sees real addresses, which is a case where in the + // classic analysis (which is what we're doing) the probe does not attempt + // to connect to loopback addresses because it doesn't make sense. + if entry.Type == minipipeline.WebObservationTypeDNSLookup && + !entry.Failure.IsNone() && entry.Failure.Unwrap() == "" && + !entry.ControlDNSLookupFailure.IsNone() && + entry.ControlDNSLookupFailure.Unwrap() == "" && + !entry.DNSResolvedAddrs.IsNone() && !entry.ControlDNSResolvedAddrs.IsNone() && + analysisContainsOnlyLoopbackAddrs(entry.DNSResolvedAddrs.Unwrap()) && + !analysisContainsOnlyLoopbackAddrs(entry.ControlDNSResolvedAddrs.Unwrap()) { + tk.setBlockingString("dns") + return + } + + // 7. handle the case of DNS success with loopback addrs, which is the case + // where neither the probe nor the TH attempt to measure endpoints. + if entry.Type == minipipeline.WebObservationTypeDNSLookup && + !entry.Failure.IsNone() && entry.Failure.Unwrap() == "" && + !entry.ControlDNSLookupFailure.IsNone() && + entry.ControlDNSLookupFailure.Unwrap() == "" && + !entry.DNSResolvedAddrs.IsNone() && !entry.ControlDNSResolvedAddrs.IsNone() && + analysisContainsOnlyLoopbackAddrs(entry.DNSResolvedAddrs.Unwrap()) && + analysisContainsOnlyLoopbackAddrs(entry.ControlDNSResolvedAddrs.Unwrap()) { + tk.setWebsiteDown() + return + } + + // TODO(bassosimone): we should handle the case where a domain + // exists but there aren't IP addresses for it. + } +} + +// analysisContainsOnlyLoopbackAddrs returns true iff the given set contains one or +// more IP addresses and all these adresses are loopback addresses. +func analysisContainsOnlyLoopbackAddrs(addrs minipipeline.Set[string]) bool { + var count int + for _, addr := range addrs.Keys() { + if net.ParseIP(addr) == nil { + continue + } + if !netxlite.IsLoopback(addr) { + return false + } + count++ } + return count > 0 } diff --git a/internal/experiment/webconnectivitylte/analysisclassic_test.go b/internal/experiment/webconnectivitylte/analysisclassic_test.go index 5d6e27bdbc..c94df6c231 100644 --- a/internal/experiment/webconnectivitylte/analysisclassic_test.go +++ b/internal/experiment/webconnectivitylte/analysisclassic_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/apex/log" + "github.com/ooni/probe-cli/v3/internal/minipipeline" "github.com/ooni/probe-cli/v3/internal/mocks" "github.com/ooni/probe-cli/v3/internal/model" "github.com/ooni/probe-cli/v3/internal/runtimex" @@ -85,3 +86,46 @@ func TestTestKeys_analysisDNSToplevel(t *testing.T) { }) } } + +func TestAnalysisClassicContainsOnlyLoopbackAddrs(t *testing.T) { + type testcase struct { + name string + input minipipeline.Set[string] + expect bool + } + + cases := []testcase{{ + name: "with empty set", + input: minipipeline.NewSet[string](), + expect: false, + }, { + name: "with only loopback addrs", + input: minipipeline.NewSet("127.0.0.1", "::1"), + expect: true, + }, { + name: "with mixed addrs", + input: minipipeline.NewSet("127.0.0.1", "130.192.91.211", "::1"), + expect: false, + }, { + name: "make sure we skip non-addresses", + input: minipipeline.NewSet("antani"), + expect: false, + }, { + name: "make sure we say not loopback with non-addresses", + input: minipipeline.NewSet("::1", "130.192.91.211", "antani", "127.0.0.1"), + expect: false, + }, { + name: "make sure we say loopback with non-addresses", + input: minipipeline.NewSet("::1", "antani", "127.0.0.1"), + expect: true, + }} + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + got := analysisContainsOnlyLoopbackAddrs(tc.input) + if got != tc.expect { + t.Fatal("expected", tc.expect, "got", got) + } + }) + } +} diff --git a/internal/experiment/webconnectivitylte/analysisext.go b/internal/experiment/webconnectivitylte/analysisext.go index 5c9f5941b8..c7b5ee23ba 100644 --- a/internal/experiment/webconnectivitylte/analysisext.go +++ b/internal/experiment/webconnectivitylte/analysisext.go @@ -64,7 +64,16 @@ func analysisExtDNS(tk *TestKeys, analysis *minipipeline.WebAnalysis, info io.Wr // we're processing N >= 1 DNS lookups. if failures := analysis.DNSLookupSuccessWithBogonAddresses; failures.Len() > 0 { - tk.BlockingFlags |= AnalysisBlockingFlagDNSBlocking + // Implementation note: uncommenting the following line IS WRONG. + // + // tk.BlockingFlags |= AnalysisBlockingFlagDNSBlocking + // + // The reason why it is wrong is that DNS blocking depends on observing inconsistencies + // between the probe and the TH and it's possible to have a website misconfigured to return + // 127.0.0.1 to the probe, the TH, and possibly anyone else. + // + // See, for example, polito.it, which has addrs 192.168.59.6 and 192.168.40.1, as of + // 2024-01-24. Clearly a misconfiguration and bogons, but it can happen. tk.DNSFlags |= AnalysisFlagDNSBogon fmt.Fprintf(info, "- transactions with bogon IP addrs: %s\n", failures.String()) } diff --git a/internal/experiment/webconnectivityqa/dnshijacking.go b/internal/experiment/webconnectivityqa/dnshijacking.go index dc7e29e30c..b0822fb123 100644 --- a/internal/experiment/webconnectivityqa/dnshijacking.go +++ b/internal/experiment/webconnectivityqa/dnshijacking.go @@ -78,3 +78,59 @@ func dnsHijackingToProxyWithHTTPSURL() *TestCase { }, } } + +// dnsHijackingToLocalhostWithHTTP is the case where an ISP rule returns 127.0.0.1 +func dnsHijackingToLocalhostWithHTTP() *TestCase { + return &TestCase{ + Name: "dnsHijackingToLocalhostWithHTTP", + Flags: TestCaseFlagNoV04, + Input: "http://www.example.com/", + Configure: func(env *netemx.QAEnv) { + + // add DPI rule to force all the cleartext DNS queries to + // point the client to use the loopback address. + env.DPIEngine().AddRule(&netem.DPISpoofDNSResponse{ + Addresses: []string{"127.0.0.1"}, + Logger: env.Logger(), + Domain: "www.example.com", + }) + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "inconsistent", + XDNSFlags: 5, // AnalysisFlagDNSBogon | AnalysisDNSFlagUnexpectedAddrs + XBlockingFlags: 33, // AnalysisBlockingFlagDNSBlocking | AnalysisBlockingFlagSuccess + Accessible: false, + Blocking: "dns", + }, + } +} + +// dnsHijackingToLocalhostWithHTTPS is the case where an ISP rule returns 127.0.0.1 +func dnsHijackingToLocalhostWithHTTPS() *TestCase { + return &TestCase{ + Name: "dnsHijackingToLocalhostWithHTTPS", + Flags: TestCaseFlagNoV04, + Input: "https://www.example.com/", + Configure: func(env *netemx.QAEnv) { + + // add DPI rule to force all the cleartext DNS queries to + // point the client to use the loopback address. + env.DPIEngine().AddRule(&netem.DPISpoofDNSResponse{ + Addresses: []string{"127.0.0.1"}, + Logger: env.Logger(), + Domain: "www.example.com", + }) + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "inconsistent", + XDNSFlags: 5, // AnalysisFlagDNSBogon | AnalysisDNSFlagUnexpectedAddrs + XBlockingFlags: 33, // AnalysisBlockingFlagDNSBlocking | AnalysisBlockingFlagSuccess + Accessible: false, + Blocking: "dns", + }, + } +} diff --git a/internal/experiment/webconnectivityqa/localhost.go b/internal/experiment/webconnectivityqa/localhost.go new file mode 100644 index 0000000000..bfca2eb919 --- /dev/null +++ b/internal/experiment/webconnectivityqa/localhost.go @@ -0,0 +1,49 @@ +package webconnectivityqa + +import "github.com/ooni/probe-cli/v3/internal/netemx" + +// localhostWithHTTP is the case where the website DNS is misconfigured and returns a loopback address. +func localhostWithHTTP() *TestCase { + return &TestCase{ + Name: "localhostWithHTTP", + Flags: TestCaseFlagNoV04, + Input: "http://www.example.com/", + Configure: func(env *netemx.QAEnv) { + + // make sure all resolvers think the correct answer is localhost + env.ISPResolverConfig().AddRecord("www.example.com", "", "127.0.0.1") + env.OtherResolversConfig().AddRecord("www.example.com", "", "127.0.0.1") + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "consistent", + XDNSFlags: 1, // AnalysisFlagDNSBogon + Accessible: false, + Blocking: false, + }, + } +} + +// localhostWithHTTPS is the case where the website DNS is misconfigured and returns a loopback address. +func localhostWithHTTPS() *TestCase { + return &TestCase{ + Name: "localhostWithHTTPS", + Flags: TestCaseFlagNoV04, + Input: "https://www.example.com/", + Configure: func(env *netemx.QAEnv) { + + // make sure all resolvers think the correct answer is localhost + env.ISPResolverConfig().AddRecord("www.example.com", "", "127.0.0.1") + env.OtherResolversConfig().AddRecord("www.example.com", "", "127.0.0.1") + + }, + ExpectErr: false, + ExpectTestKeys: &testKeys{ + DNSConsistency: "consistent", + XDNSFlags: 1, // AnalysisFlagDNSBogon + Accessible: false, + Blocking: false, + }, + } +} diff --git a/internal/experiment/webconnectivityqa/testcase.go b/internal/experiment/webconnectivityqa/testcase.go index 4d6b13ffd2..c06c4dc3e2 100644 --- a/internal/experiment/webconnectivityqa/testcase.go +++ b/internal/experiment/webconnectivityqa/testcase.go @@ -49,6 +49,8 @@ func AllTestCases() []*TestCase { dnsBlockingBOGON(), dnsBlockingNXDOMAIN(), + dnsHijackingToLocalhostWithHTTP(), + dnsHijackingToLocalhostWithHTTPS(), dnsHijackingToProxyWithHTTPURL(), dnsHijackingToProxyWithHTTPSURL(), @@ -63,6 +65,9 @@ func AllTestCases() []*TestCase { idnaWithoutCensorshipLowercase(), idnaWithoutCensorshipWithFirstLetterUppercase(), + localhostWithHTTP(), + localhostWithHTTPS(), + redirectWithConsistentDNSAndThenConnectionRefusedForHTTP(), redirectWithConsistentDNSAndThenConnectionRefusedForHTTPS(), redirectWithConsistentDNSAndThenConnectionResetForHTTP(), diff --git a/internal/minipipeline/analysis.go b/internal/minipipeline/analysis.go index 4bc51ca974..df693f1cfb 100644 --- a/internal/minipipeline/analysis.go +++ b/internal/minipipeline/analysis.go @@ -285,11 +285,11 @@ func (wa *WebAnalysis) dnsComputeSuccessMetrics( // determine whether the probe UNEXPECTEDLY resolved any address. wa.DNSLookupSuccess.Add(obs.DNSTransactionID.Unwrap()) - // if there's a bogon, mark as invalid + // if there's a bogon, register it and continue processing. if !obs.IPAddressBogon.IsNone() && obs.IPAddressBogon.Unwrap() { - wa.DNSLookupSuccessWithInvalidAddresses.Add(obs.DNSTransactionID.Unwrap()) wa.DNSLookupSuccessWithBogonAddresses.Add(obs.DNSTransactionID.Unwrap()) - continue + // fallthrough: bogons are legitimate if the website DNS is actually misconfigured + // so we determine bogons status and invalid addresses separately } // when there is no control info, we cannot say much diff --git a/internal/minipipeline/set.go b/internal/minipipeline/set.go index a08a113a4f..28dd46deef 100644 --- a/internal/minipipeline/set.go +++ b/internal/minipipeline/set.go @@ -74,12 +74,12 @@ func (sx *Set[T]) UnmarshalJSON(data []byte) error { } // Contains returns whether the set contains a key. -func (sx *Set[T]) Contains(key T) bool { +func (sx Set[T]) Contains(key T) bool { _, found := sx.state[key] return found } // String implements fmt.Stringer -func (sx *Set[T]) String() string { +func (sx Set[T]) String() string { return fmt.Sprintf("%v", sx.Keys()) } diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis.json new file mode 100644 index 0000000000..eb6d22f54b --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis.json @@ -0,0 +1,423 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1, + 2, + 3 + ], + "DNSLookupSuccessWithInvalidAddresses": [ + 1, + 3 + ], + "DNSLookupSuccessWithValidAddress": [ + 2 + ], + "DNSLookupSuccessWithBogonAddresses": [ + 1, + 3 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [ + 1, + 3 + ], + "DNSLookupSuccessWithValidAddressClassic": [ + 2 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": 5, + "HTTPFinalResponseDiffBodyProportionFactor": 1, + "HTTPFinalResponseDiffStatusCodeMatch": true, + "HTTPFinalResponseDiffTitleDifferentLongWords": {}, + "HTTPFinalResponseDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 7, + "TagFetchBody": false, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis_classic.json new file mode 100644 index 0000000000..fc9d565f09 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/analysis_classic.json @@ -0,0 +1,104 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddresses": [ + 1 + ], + "DNSLookupSuccessWithValidAddress": [], + "DNSLookupSuccessWithBogonAddresses": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [ + 1 + ], + "DNSLookupSuccessWithValidAddressClassic": [], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/measurement.json new file mode 100644 index 0000000000..9d283c0a54 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/measurement.json @@ -0,0 +1,853 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2024-01-24 12:33:26", + "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": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.031744, + "t": 0.036807, + "transaction_id": 7, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "address": "93.184.216.34:80", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.03164, + "t": 0.038015, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2315, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.045737, + "t": 0.045737, + "transaction_id": 7, + "tags": [ + "depth=0", + "fetch_body=false" + ] + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.53808, + "t": 0.53808, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.543598, + "t": 0.543598, + "transaction_id": 5, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:80", + "failure": null, + "num_bytes": 1671, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.543621, + "t": 0.543621, + "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.000369, + "t": 0.000369, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.006281, + "t": 0.011342, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.011359, + "t": 0.011359, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 276, + "operation": "write", + "proto": "tcp", + "t0": 0.01158, + "t": 0.011592, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.011595, + "t": 0.019756, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 1702, + "operation": "read", + "proto": "tcp", + "t0": 0.019919, + "t": 0.01992, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.020844, + "t": 0.020852, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.020855, + "t": 0.020855, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 380, + "operation": "write", + "proto": "tcp", + "t0": 0.020934, + "t": 0.020977, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 201, + "operation": "read", + "proto": "tcp", + "t0": 0.02095, + "t": 0.026471, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 380, + "operation": "write", + "proto": "tcp", + "t0": 0.026513, + "t": 0.026521, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 170, + "operation": "read", + "proto": "tcp", + "t0": 0.026494, + "t": 0.031397, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.031437, + "t": 0.031437, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.031443, + "t": 0.031494, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:443", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.031419, + "t": 0.031505, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + } + ], + "queries": [ + { + "answers": [ + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "8.8.4.4", + "ttl": null + }, + { + "asn": 15169, + "as_org_name": "Google LLC", + "answer_type": "A", + "ipv4": "8.8.8.8", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "dns.google", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001329, + "t": 0.006194, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "8.8.4.4", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.006281, + "t": 0.011342, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "8.8.4.4:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDeDCCAmCgAwIBAgIUOvcYN2bJ4MVTv+STCXRv0GhNMjkwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMTI0MTEzMzI2WhcNMjQwMTI0MTMzMzI2WjAtMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRMwEQYDVQQDEwpkbnMuZ29vZ2xlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApIGNGBnm9bgiZINvYq/haZeuXXwUByjwKz91BbDpVH/VjR98ctL9V0702WIU9xtgZcRFeDm7ShqDVU9bj98sjYO2ZFUKbVJlFTEQRnrOO7FebWiWYEUqJSdsIgZinSK4k+x9eQ9I43RJbclkKfvkZEfcO2Lw4ihHdr/VeQy8QzIL06l3qYTaKAxS/vg+w4s4OeCf7HlkJzhWPFk/Cd0Wx6iGKHB3knjJXk5+5hf4OTnZ+yuONGuRyaTbWMEun3+0hTUbq5JiGRxmKMgaNCH6BXyRKhfYKwx4/CYG29a5G7p0OZO2PbtO1ylAJcWV0gCBMRYPT8XD12dkTPoN29dC3QIDAQABo4GdMIGaMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSeLN7/XEi/m5MOH3NKIjnC7TuaxzAfBgNVHSMEGDAWgBSe+fNhXFtjwRIE0ntC87duDmwUNzAlBgNVHREEHjAcggpkbnMuZ29vZ2xlgg5kbnMuZ29vZ2xlLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAgAeRLWgF5zMFwYUI/dNofVORX/xySnzyTqpBpkP61og3iayoAV7ygEKe6H+o7VNQFE2q1Jo8+HaMX8jXk1Ma3fgpVtJ8JIC61Bump8qWdf0tJy6AF7hhQe5vXukWXqUzfA0TSYAI2l9JRno60yt7snKUGLNFNNpGP2nHLXMPpoMqb9vvdurCyNlvbX9NOxDT2tRN7dHeHFbecsqSFjXNg2zzdbgdRQO+RZvc31aYncMqzaBKlDcRFSK9ccb3pPwQHkce1I0hGGYz/ASK3QVwHWdm7P4+d78qVZi8ukRbd6MpJCF/qCw8BmGXgV2zRclZs5ULx6BrNx12W4ymJTeC6A==", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAMAqMyKh4SGKlC5ytqhX+Ltih9raMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyMzEyMzMyNloXDTI0MDEyNTEyMzMyNlowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpYnFGp6xDhEdvgArzSDj3IxOaN6FHAmb1O5zpSHJbSt2FHrbra0p0Av1vau9ZgqjR5TrrCy5NJ97HEbOR3fMcnSPWHg5IkYdCCk8cHzsdI8A+kti02IzCR9LhrhgjS3WJcTBO/SjftEyFIWcpB7luoojpiIikaKdXUtgnC/cpbKauss5NdZA4Ms8WL5PkWXht702O30NWC/+wA9Q01TQVwfmXYRAUh7WuMXZDbxh/LAPZ3z53kAgPLraT9vuUHyPbISGi88x2a5mJpRzejV0LrbiWyWb1dWILSdZm6W+Tj2OP0Nz/ZMBD7z8NKfm92yDl7FySNP34afjpNQ12stMNAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSe+fNhXFtjwRIE0ntC87duDmwUNzAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAgLM/FAajA1b0ixUsc5h2/8LQNhaLkpRKuhO9MxLLmLHfZgYQ1eIRAiaSmyQj7vRIHkuQzIMWgu8Do4cYDNbaLAvytw9uyeCfit52MFv5l6M6pN/Ra/JCE3gwh66Snmd+uf8DdVPRpe8VTksq5ygLG+P79/yk5xPBLG9mrHmNGgxLUI3ekCiWJPhPdpLhd26xc0yIb7KqkwudeoCJiLEPmK559GFCq+gy2jldAV6Y6RlxFfMY3FptTSJFvnqppr7q9LxJ1UTHfOnVT0xjwKgdiSjXg3/wmcmTDbyxLCkdwYSk7cqpkDOrBfxvi0VAd0Ck3QOriSMixJBvnuGfZuZaPA==", + "format": "base64" + } + ], + "server_name": "dns.google", + "t0": 0.011359, + "t": 0.020855, + "tags": [ + "depth=0" + ], + "tls_version": "TLSv1.3", + "transaction_id": 2 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000342, + "t": 0.000342, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000794, + "t": 0.000802, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000885, + "t": 0.000891, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000901, + "t": 0.004028, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000807, + "t": 0.004274, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.00433, + "t": 0.00433, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "ytiBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00405, + "t": 0.005967, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "tkmBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.004288, + "t": 0.006561, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + } + ], + "queries": [ + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000366, + "t": 0.003831, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "ytiBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000533, + "t": 0.004034, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "tkmBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEfwAAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000564, + "t": 0.004279, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "6uGBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.google/dns-query", + "t0": 0.000524, + "t": 0.026498, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "ij+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.google/dns-query", + "t0": 0.00052, + "t": 0.031422, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:80", + "failure": null, + "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", + "www.example.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": "www.example.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://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.53808, + "t": 0.543598, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 5 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.031744, + "t": 0.036807, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "transaction_id": 7 + }, + { + "ip": "93.184.216.34", + "port": 80, + "status": { + "failure": null, + "success": true + }, + "t0": 0.03164, + "t": 0.038015, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 5 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnTCCAoWgAwIBAgIUFHdSIg8fQGZLacoPliElsfFl9jYwDQYJKoZIhvcNAQELBQAwHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwHhcNMjQwMTI0MTEzMzI2WhcNMjQwMTI0MTMzMzI2WjAyMRYwFAYDVQQKEw1PT05JIE5ldGVtIENBMRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCkgY0YGeb1uCJkg29ir+Fpl65dfBQHKPArP3UFsOlUf9WNH3xy0v1XTvTZYhT3G2BlxEV4ObtKGoNVT1uP3yyNg7ZkVQptUmUVMRBGes47sV5taJZgRSolJ2wiBmKdIriT7H15D0jjdEltyWQp++RkR9w7YvDiKEd2v9V5DLxDMgvTqXephNooDFL++D7Dizg54J/seWQnOFY8WT8J3RbHqIYocHeSeMleTn7mF/g5Odn7K440a5HJpNtYwS6ff7SFNRurkmIZHGYoyBo0IfoFfJEqF9grDHj8Jgbb1rkbunQ5k7Y9u07XKUAlxZXSAIExFg9PxcPXZ2RM+g3b10LdAgMBAAGjgb0wgbowDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFJ4s3v9cSL+bkw4fc0oiOcLtO5rHMB8GA1UdIwQYMBaAFJ7582FcW2PBEgTSe0Lzt24ObBQ3MEUGA1UdEQQ+MDyCD3d3dy5leGFtcGxlLmNvbYILZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLm9yZ4ILZXhhbXBsZS5vcmcwDQYJKoZIhvcNAQELBQADggEBAH+tx1bojS33KEZk8gpIwbMe8IHf2zCqdv+al6mBLn+53n+ecqH+0ERrdqsdskIVRvTh552OQVUaPN+jU89/ARyMijNr97L8lvGKp2/AetayspegGRKBXHn5PluuYASirMIUk21xhvG2vCdbw0PUy6r70QRQT+fqYa9Mhq1uyiiT5N+XbxJuy1XFgMD4WE37E38nFLQY/tYtpVsUsXBo1MCWJaHJrex4zS5QdzfEgd/PmP8kARSgwioT/0p7e7cCYvF/FeWo6yb6/bgkjacYl0EykE9iy2pevkKzDw3EEgC0QLwj4i1TPriKZUZl9ENhyZ8g8i4V7hMoCtoAOAvYJCg=", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAMAqMyKh4SGKlC5ytqhX+Ltih9raMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyMzEyMzMyNloXDTI0MDEyNTEyMzMyNlowHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpYnFGp6xDhEdvgArzSDj3IxOaN6FHAmb1O5zpSHJbSt2FHrbra0p0Av1vau9ZgqjR5TrrCy5NJ97HEbOR3fMcnSPWHg5IkYdCCk8cHzsdI8A+kti02IzCR9LhrhgjS3WJcTBO/SjftEyFIWcpB7luoojpiIikaKdXUtgnC/cpbKauss5NdZA4Ms8WL5PkWXht702O30NWC/+wA9Q01TQVwfmXYRAUh7WuMXZDbxh/LAPZ3z53kAgPLraT9vuUHyPbISGi88x2a5mJpRzejV0LrbiWyWb1dWILSdZm6W+Tj2OP0Nz/ZMBD7z8NKfm92yDl7FySNP34afjpNQ12stMNAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSe+fNhXFtjwRIE0ntC87duDmwUNzAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAgLM/FAajA1b0ixUsc5h2/8LQNhaLkpRKuhO9MxLLmLHfZgYQ1eIRAiaSmyQj7vRIHkuQzIMWgu8Do4cYDNbaLAvytw9uyeCfit52MFv5l6M6pN/Ra/JCE3gwh66Snmd+uf8DdVPRpe8VTksq5ygLG+P79/yk5xPBLG9mrHmNGgxLUI3ekCiWJPhPdpLhd26xc0yIb7KqkwudeoCJiLEPmK559GFCq+gy2jldAV6Y6RlxFfMY3FptTSJFvnqppr7q9LxJ1UTHfOnVT0xjwKgdiSjXg3/wmcmTDbyxLCkdwYSk7cqpkDOrBfxvi0VAd0Ck3QOriSMixJBvnuGfZuZaPA==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.036822, + "t": 0.045702, + "tags": [ + "depth=0", + "fetch_body=false" + ], + "tls_version": "TLSv1.3", + "transaction_id": 7 + } + ], + "x_control_request": { + "http_request": "http://www.example.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": [ + "127.0.0.1:443", + "127.0.0.1:80", + "93.184.216.34:443", + "93.184.216.34:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + }, + "93.184.216.34:80": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "127.0.0.1": { + "asn": 0, + "flags": 5 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 11 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:127.0.0.1 Flags:3} {Addr:93.184.216.34 Flags:4}]", + "t": 0.031553 + }, + { + "msg": "conn 93.184.216.34:80: granted permission: true", + "t": 0.538048 + } + ], + "control_failure": null, + "x_dns_flags": 5, + "dns_experiment_failure": null, + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 33, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.543811, + "test_start_time": "2024-01-24 12:33:26", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations.json new file mode 100644 index 0000000000..3e3c81e867 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations.json @@ -0,0 +1,372 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "KnownTCPEndpoints": { + "5": { + "TagDepth": 0, + "Type": 3, + "Failure": "", + "TransactionID": 5, + "TagFetchBody": true, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 5, + "EndpointProto": "tcp", + "EndpointPort": "80", + "EndpointAddress": "93.184.216.34:80", + "TCPConnectFailure": "", + "TLSHandshakeFailure": null, + "TLSServerName": null, + "HTTPRequestURL": "http://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + "7": { + "TagDepth": 0, + "Type": 2, + "Failure": "", + "TransactionID": 7, + "TagFetchBody": false, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": [ + "93.184.216.34" + ], + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 7, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": null, + "HTTPFailure": null, + "HTTPResponseStatusCode": null, + "HTTPResponseBodyLength": null, + "HTTPResponseBodyIsTruncated": null, + "HTTPResponseHeadersKeys": null, + "HTTPResponseLocation": null, + "HTTPResponseTitle": null, + "HTTPResponseIsFinal": null, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations_classic.json new file mode 100644 index 0000000000..7166a11553 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTP/observations_classic.json @@ -0,0 +1,63 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis.json new file mode 100644 index 0000000000..8faac50938 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis.json @@ -0,0 +1,265 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 1, + 2 + ], + "DNSLookupSuccessWithInvalidAddresses": [ + 1, + 2 + ], + "DNSLookupSuccessWithValidAddress": [], + "DNSLookupSuccessWithBogonAddresses": [ + 1, + 2 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [ + 1, + 2 + ], + "DNSLookupSuccessWithValidAddressClassic": [], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": 4, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": 1, + "HTTPFinalResponseDiffStatusCodeMatch": true, + "HTTPFinalResponseDiffTitleDifferentLongWords": {}, + "HTTPFinalResponseDiffUncommonHeadersIntersection": { + "alt-svc": true, + "content-length": true + }, + "Linear": [ + { + "TagDepth": 0, + "Type": 3, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": null, + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis_classic.json new file mode 100644 index 0000000000..c0c3f3f0b6 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/analysis_classic.json @@ -0,0 +1,104 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + }, + "DNSLookupSuccess": [ + 2 + ], + "DNSLookupSuccessWithInvalidAddresses": [ + 2 + ], + "DNSLookupSuccessWithValidAddress": [], + "DNSLookupSuccessWithBogonAddresses": [ + 2 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [ + 2 + ], + "DNSLookupSuccessWithValidAddressClassic": [], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/measurement.json new file mode 100644 index 0000000000..fc0d4e50ad --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/measurement.json @@ -0,0 +1,550 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2024-01-24 12:33:27", + "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": "93.184.216.34:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.102388, + "t": 0.10753, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.159346, + "t": 0.159346, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.184365, + "t": 0.184365, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 2316, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.223341, + "t": 0.223341, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_start", + "t0": 0.61645, + "t": 0.61645, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "failure": null, + "operation": "http_transaction_done", + "t0": 0.622243, + "t": 0.622243, + "transaction_id": 4, + "tags": [ + "depth=0", + "fetch_body=true" + ] + }, + { + "address": "93.184.216.34:443", + "failure": null, + "num_bytes": 4031, + "operation": "bytes_received_cumulative", + "proto": "tcp", + "t0": 0.622276, + "t": 0.622276, + "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.00007, + "t": 0.00007, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000106, + "t": 0.00014, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.00013, + "t": 0.000188, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000146, + "t": 0.003494, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000192, + "t": 0.003718, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.003762, + "t": 0.003762, + "transaction_id": 1, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "352BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003506, + "t": 0.006125, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": [ + { + "asn": 15133, + "as_org_name": "Edgecast Inc.", + "answer_type": "A", + "ipv4": "93.184.216.34", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "skiBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEXbjYIg==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.003745, + "t": 0.006368, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + } + ], + "queries": [ + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "352BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.00008, + "t": 0.003497, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "skiBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEfwAAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000111, + "t": 0.003727, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000088, + "t": 0.003849, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "alpn": "http/1.1", + "failure": null, + "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", + "www.example.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": "www.example.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://www.example.com/" + }, + "response": { + "body": "\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\t\u003ctitle\u003eDefault Web Page\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv\u003e\n\t\u003ch1\u003eDefault Web Page\u003c/h1\u003e\n\n\t\u003cp\u003eThis is the default web page of the default domain.\u003c/p\u003e\n\n\t\u003cp\u003eWe detect webpage blocking by checking for the status code first. If the status\n\tcode is different, we consider the measurement http-diff. On the contrary when\n\tthe status code matches, we say it's all good if one of the following check succeeds:\u003c/p\u003e\n\n\t\u003cp\u003e\u003col\u003e\n\t\t\u003cli\u003ethe body length does not match (we say they match is the smaller of the two\n\t\twebpages is 70% or more of the size of the larger webpage);\u003c/li\u003e\n\n\t\t\u003cli\u003ethe uncommon headers match;\u003c/li\u003e\n\n\t\t\u003cli\u003ethe webpage title contains mostly the same words.\u003c/li\u003e\n\t\u003c/ol\u003e\u003c/p\u003e\n\n\t\u003cp\u003eIf the three above checks fail, then we also say that there is http-diff. Because\n\twe need QA checks to work as intended, the size of THIS webpage you are reading\n\thas been increased, by adding this description, such that the body length check fails. The\n\toriginal webpage size was too close to the blockpage in size, and therefore we did see\n\tthat there was no http-diff, as it ought to be.\u003c/p\u003e\n\n\t\u003cp\u003eTo make sure we're not going to have this issue in the future, there is now a runtime\n\tcheck that causes our code to crash if this web page size is too similar to the one of\n\tthe default blockpage. We chose to add this text for additional clarity.\u003c/p\u003e\n\n\t\u003cp\u003eAlso, note that the blockpage MUST be very small, because in some cases we need\n\tto spoof it into a single TCP segment using ooni/netem's DPI.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n", + "body_is_truncated": false, + "code": 200, + "headers_list": [ + [ + "Alt-Svc", + "h3=\":443\"" + ], + [ + "Content-Length", + "1533" + ], + [ + "Content-Type", + "text/html; charset=utf-8" + ], + [ + "Date", + "Thu, 24 Aug 2023 14:35:29 GMT" + ] + ], + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + } + }, + "t0": 0.61645, + "t": 0.622243, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 4 + } + ], + "tcp_connect": [ + { + "ip": "93.184.216.34", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.102388, + "t": 0.10753, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "transaction_id": 4 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "93.184.216.34:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDnjCCAoagAwIBAgIVAN6kmpOxi5oxmFf05tasgYTYagMzMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyNDExMzMyN1oXDTI0MDEyNDEzMzMyN1owMjEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEYMBYGA1UEAxMPd3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwzfau93gAtqXrqOPPi7TSnZKeMRotWikc2TC7Y/+/1MGR85TiYABYNInm9ddpJz+lnDkWoe06oaGCvQCO30MnVlobcKGANrzaAjpiTa3R5qSmNRgOTSRFCAEJVV1AF7SQXLxdF1lhKbm03CPpo0XyyXq9ybxBV32NBQR6hv+jSOgqnqKyfq5yxTymIvXrKZLjk8DdJecqhv3+bdxHag47vM6jSHnE2oH22ysDnQME13iDQzfewYVGKYvwkE6doKbo829l1HyohCqfSoppVpopp1GVeFt/rOzvHMaMRo1vjiPffaIF9rvtL2/wr/FzuLmAahYVSJ/E4bq5rxSvxDZ/wIDAQABo4G9MIG6MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQu8jpcqB/6sKkvG/ENvsTbjsM0rTAfBgNVHSMEGDAWgBTuXAGBTVjp8cfRoUsRgbSPaE6+7DBFBgNVHREEPjA8gg93d3cuZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQA6mJ+OEKNmhr0huYxF0YyBCUmUqh4rddK/zyrZxrcdmZmmTFWehevfUxeY/SL0gwmlDVxM62rtUxN6tL05pSSnALFYPdHdGAnsucxKobePZwb2tYtoVRdI5IfE9kHL6C5AsAXfCjQvyif6s0omUOpbZAbHJvEvyq4Y9gQvkC98g7/oB/8PWTYqhTBNcqKs/5miQS5jxos9KB3epBehjc4TiAwdrjsVgly0s9Txzwy7bsFZKchklsug/4Wn1BqyDs4A15kt9KFw5jvuI1hACkC48rmsQP4M0oU+BVDpNxea2yDhSP8mUVHbiWTjJ9OtT3eGLQYCBGPO+TBz2AO5Flxz", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAIb+35rJ6y7/3dVxigmkodL2TJlJMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyMzEyMzMyN1oXDTI0MDEyNTEyMzMyN1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCxz3l+FdFcWQTevwt/e8c9u83ddHYllL7dCZIvmcXpbC3CA3URvulVWCCJLOR3D8aMjatXry3fJ61nx3BA/sr4bzjLj3qV16aClzQQZqFV5FW7VKeDUFXcO+GZLdoKkCpnOgAR7frxQ5aXufcdmFAz7rm4Ul/IHS3cFDINGwGE/EpS0OFGbp6q36r2cei9QzcsxchsPDBet3/ZGROWxVzXbO6c4MA/6JTjxMl+Cd4n5vjftvREl89q2wsJrAL9Q5VBWzhtsU9j0X04DuHR4kD5tuitjICeQI59vt297DiSDeTFrCh57J24MjicJF8aXe/XRb7mbQFwicofsxpolqhDAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTuXAGBTVjp8cfRoUsRgbSPaE6+7DAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAIXl+Bdt0ujKTJghtwpyiqSb6O737tg6XeAjaPIVBOfyeLZwLonGu27ZNROQj4ArxqZuKM9AN5/9XelNmpIU1Q/fcU/Qdbtnw2ar8TAi+qUabAJWT/g6GmG6I1i6sXZPYfABRlHpgi+4ZZH0NZwbjsdvkzn5YxxiD0LGEGUtProc6TzqH6m+qvAKagymwdqEvzvPzFSsMG2bst/KVjpuIrdnx+zNr8onAXTtQhpq4mwKkAZhbN3hHb9Ulm5vTEk4JXa1UhN0GQ05/hijTGXzy7RQBj/NRXhwStm+6q4z3GbwTtHjCxgZSQFdPfxlt6M98oJRwLzzH4weORMzZv0E/RQ==", + "format": "base64" + } + ], + "server_name": "www.example.com", + "t0": 0.107545, + "t": 0.116377, + "tags": [ + "depth=0", + "fetch_body=true" + ], + "tls_version": "TLSv1.3", + "transaction_id": 4 + } + ], + "x_control_request": { + "http_request": "https://www.example.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": [ + "127.0.0.1:443", + "127.0.0.1:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": { + "93.184.216.34:443": { + "status": true, + "failure": null + } + }, + "tls_handshake": { + "93.184.216.34:443": { + "server_name": "www.example.com", + "status": true, + "failure": null + } + }, + "quic_handshake": {}, + "http_request": { + "body_length": 1533, + "discovered_h3_endpoint": "www.example.com:443", + "failure": null, + "title": "Default Web Page", + "headers": { + "Alt-Svc": "h3=\":443\"", + "Content-Length": "1533", + "Content-Type": "text/html; charset=utf-8", + "Date": "Thu, 24 Aug 2023 14:35:29 GMT" + }, + "status_code": 200 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "93.184.216.34" + ] + }, + "ip_info": { + "127.0.0.1": { + "asn": 0, + "flags": 5 + }, + "93.184.216.34": { + "asn": 15133, + "flags": 10 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:127.0.0.1 Flags:3}]", + "t": 0.011553 + }, + { + "msg": "conn 93.184.216.34:443: granted permission: true", + "t": 0.616422 + } + ], + "control_failure": null, + "x_dns_flags": 5, + "dns_experiment_failure": null, + "dns_consistency": "inconsistent", + "http_experiment_failure": null, + "x_blocking_flags": 33, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": "dns", + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.622449, + "test_start_time": "2024-01-24 12:33:27", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations.json new file mode 100644 index 0000000000..065997141e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations.json @@ -0,0 +1,219 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "KnownTCPEndpoints": { + "4": { + "TagDepth": 0, + "Type": 3, + "Failure": "", + "TransactionID": 4, + "TagFetchBody": true, + "DNSTransactionID": null, + "DNSDomain": null, + "DNSLookupFailure": null, + "DNSQueryType": null, + "DNSEngine": null, + "DNSResolvedAddrs": null, + "IPAddress": "93.184.216.34", + "IPAddressASN": 15133, + "IPAddressBogon": false, + "EndpointTransactionID": 4, + "EndpointProto": "tcp", + "EndpointPort": "443", + "EndpointAddress": "93.184.216.34:443", + "TCPConnectFailure": "", + "TLSHandshakeFailure": "", + "TLSServerName": "www.example.com", + "HTTPRequestURL": "https://www.example.com/", + "HTTPFailure": "", + "HTTPResponseStatusCode": 200, + "HTTPResponseBodyLength": 1533, + "HTTPResponseBodyIsTruncated": false, + "HTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "HTTPResponseLocation": null, + "HTTPResponseTitle": "Default Web Page", + "HTTPResponseIsFinal": true, + "ControlDNSDomain": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": "", + "ControlTLSHandshakeFailure": "", + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + }, + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations_classic.json new file mode 100644 index 0000000000..b0ebf6b149 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/dnsHijackingToLocalhostWithHTTPS/observations_classic.json @@ -0,0 +1,63 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "93.184.216.34" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "", + "ControlHTTPResponseStatusCode": 200, + "ControlHTTPResponseBodyLength": 1533, + "ControlHTTPResponseHeadersKeys": { + "Alt-Svc": true, + "Content-Length": true, + "Content-Type": true, + "Date": true + }, + "ControlHTTPResponseTitle": "Default Web Page" + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "93.184.216.34" + ], + "FinalResponseFailure": "" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis.json new file mode 100644 index 0000000000..b4f973059e --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis.json @@ -0,0 +1,287 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + }, + "DNSLookupSuccess": [ + 1, + 2, + 3 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1, + 2, + 3 + ], + "DNSLookupSuccessWithBogonAddresses": [ + 1, + 2, + 3 + ], + "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": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis_classic.json new file mode 100644 index 0000000000..31fed35b4b --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/analysis_classic.json @@ -0,0 +1,99 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + }, + "DNSLookupSuccess": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1 + ], + "DNSLookupSuccessWithBogonAddresses": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 1 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/measurement.json new file mode 100644 index 0000000000..0105510ffd --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/measurement.json @@ -0,0 +1,551 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "http://www.example.com/", + "measurement_start_time": "2024-01-24 12:33:07", + "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": [], + "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.000357, + "t": 0.000357, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "operation": "connect", + "proto": "tcp", + "t0": 0.00739, + "t": 0.013297, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_start", + "t0": 0.013317, + "t": 0.013317, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 279, + "operation": "write", + "proto": "tcp", + "t0": 0.013557, + "t": 0.013568, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 576, + "operation": "read", + "proto": "tcp", + "t0": 0.01357, + "t": 0.021833, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 1693, + "operation": "read", + "proto": "tcp", + "t0": 0.021989, + "t": 0.021991, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 64, + "operation": "write", + "proto": "tcp", + "t0": 0.022908, + "t": 0.022915, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "tls_handshake_done", + "t0": 0.022918, + "t": 0.022918, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 383, + "operation": "write", + "proto": "tcp", + "t0": 0.023002, + "t": 0.023047, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 201, + "operation": "read", + "proto": "tcp", + "t0": 0.023027, + "t": 0.028433, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 383, + "operation": "write", + "proto": "tcp", + "t0": 0.028479, + "t": 0.028492, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 170, + "operation": "read", + "proto": "tcp", + "t0": 0.028461, + "t": 0.033112, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.033163, + "t": 0.033163, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": null, + "num_bytes": 24, + "operation": "write", + "proto": "tcp", + "t0": 0.033167, + "t": 0.033226, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "9.9.9.9:443", + "failure": "eof_error", + "operation": "read", + "proto": "tcp", + "t0": 0.033143, + "t": 0.033239, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + } + ], + "queries": [ + { + "answers": [ + { + "asn": 19281, + "as_org_name": "Quad9", + "answer_type": "A", + "ipv4": "9.9.9.9", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "dns.quad9.net", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.001286, + "t": 0.007199, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [ + { + "ip": "9.9.9.9", + "port": 443, + "status": { + "failure": null, + "success": true + }, + "t0": 0.00739, + "t": 0.013297, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "tls_handshakes": [ + { + "network": "tcp", + "address": "9.9.9.9:443", + "cipher_suite": "TLS_AES_128_GCM_SHA256", + "failure": null, + "negotiated_protocol": "http/1.1", + "no_tls_verify": false, + "peer_certificates": [ + { + "data": "MIIDbzCCAlegAwIBAgIVAKo+18nWj3oHarQPWHHuOwhjsjWKMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyNDExMzMwN1oXDTI0MDEyNDEzMzMwN1owMDEWMBQGA1UEChMNT09OSSBOZXRlbSBDQTEWMBQGA1UEAxMNZG5zLnF1YWQ5Lm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOQlthziG4ergZ2ZfksdBzJOFTZzHY+i724rH1+yJrpZxOlKjo/oH5z2YxeGzBNd3kObKi+Gaozqe+zkG+8/Yr6jLjp03W1NImLJinGERTTGpIvYJpjNAmx/liq30i7CMC4GEUXVyx/nuHAkiSVvJi93kLAsnIu9EDjzN9xYKLdRV6mgnbT+MDRpj3S5OFliNAM832TgNNin1IJ8zzc1o4Ml/O6Hyr/Apy6UzUlxbeAQFZqfuidRZY28XJ7+NYmcidbaxI0ITDmvN1MS9syFhtaseqgkg8a6VMlh9XG3hbBLNQyks0C5KELK03qVNE36HhQTsb/fASBJ2zw/Ebn54hMCAwEAAaOBkDCBjTAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUqwP7h6oMKZnqutgymGRzafPtsZUwHwYDVR0jBBgwFoAUING1hgcNY6aLjVeN9UjmRVXL9+MwGAYDVR0RBBEwD4INZG5zLnF1YWQ5Lm5ldDANBgkqhkiG9w0BAQsFAAOCAQEAuiS8UInidlPYkD7/70IN/qT8J8+fRhKTB+Y99j1bMuJtMM/6ODWI59jAe8ptHA8FDS8jSr8kvzwbFCBsuRei734stmy5UE0jahBY8oaTUGm9RJTWSYYSyD0VmGyT2Jg0IRrFmbIIL265KIuc2beozo2L0/W3s6blay8F5DLlh2eV8MStZQq4WrUv5BQXIQnfr7Cm+qCF91NJa+8A3xZyIXfFIvQqauFcdzuH5DT/DKVWbePM1GUgVYIppC1uKLgwvifON6uT1bQDr8W9nXiP7KCdE7xThnW3Ybo/TLBdmOVwtC1grX/vunqg5Ia55GJCdMpqmGNRvO3R6o6+y7EXqA==", + "format": "base64" + }, + { + "data": "MIIDNjCCAh6gAwIBAgIVAJI0TqsrrWZxzB4rM8nnqUE+Ww1PMA0GCSqGSIb3DQEBCwUAMB8xDTALBgNVBAoTBE9PTkkxDjAMBgNVBAMTBWphZmFyMB4XDTI0MDEyMzEyMzMwN1oXDTI0MDEyNTEyMzMwN1owHzENMAsGA1UEChMET09OSTEOMAwGA1UEAxMFamFmYXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDt/wQsJTg4/9bvTBNKrjwi9r2Ud8XPr5m2ndjn464EWVKhriKnBQZIGbIlGujwi0UXuA+cW4Hh4/4jrtHLpkxDWgRNcqww9fwR6q1p0YXHIvOGLe3ofTrz+5W3pzAVkjem1w10ksqLv1XY39N4s0IHoucXWGVowcxHzkaTBMd7FBBHMQtIOIWenzFo8JajDONhQ95zXzWaoSKSgTsAQ6nqGr3TAP7kcDtuNuQd3aT6zpipm9Rf7vA7QQKCDOYaHy1JUyXB/bYI0bjOp1R5Tf+i2htbM4EtSn1hno5ChySopMecHCEKOIwMl0kKwDl+Ul4GA/aXlxoWuXe7RUv7t/vBAgMBAAGjaTBnMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQg0bWGBw1jpouNV431SOZFVcv34zAQBgNVHREECTAHggVqYWZhcjANBgkqhkiG9w0BAQsFAAOCAQEAxwK8P2FM15VtExdNkJlDqvyzWkLTB2AujPTqRPTlmLopJStYot1uN4QMtKsa9Y6YYZxdVbHh+Pj/iVPTBEkq1czR3N33PmDMgDXDtudlxe5Y/hjbm2f0jaG62pJDtKXIC9rL+kMRdb/cz8Yyeqegunw7f+EPhbwZSN4kS5TAvswmH3RPm3CghQuMuzdntN6T02ImfPEcfN/9+Rj5w4TUJnGie4nDyWOeMkYukTsobZmTKVqP2D6HMkhzl3Ifb7Bq7YFMjCCNdUseJDy4SEg+skYJLuBu6/x0u5i5Auu3XQWmNVYT4OgoTqD0XWCq6j16/l0whiG7zJxlVlAZIam4zA==", + "format": "base64" + } + ], + "server_name": "dns.quad9.net", + "t0": 0.013317, + "t": 0.022918, + "tags": [ + "depth=0" + ], + "tls_version": "TLSv1.3", + "transaction_id": 2 + } + ] + }, + "x_do53": { + "network_events": [ + { + "failure": null, + "operation": "resolve_start", + "t0": 0.000341, + "t": 0.000341, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000734, + "t": 0.000741, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000749, + "t": 0.000819, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.000799, + "t": 0.006603, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000853, + "t": 0.007302, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.007369, + "t": 0.007369, + "transaction_id": 3, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "efaBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEfwAAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000447, + "t": 0.00663, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "FV2BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000465, + "t": 0.007307, + "tags": [ + "depth=0" + ], + "transaction_id": 3 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000622, + "t": 0.007435, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "doh", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "alyBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEfwAAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000465, + "t": 0.028465, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": null, + "engine": "doh", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "WYeBAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "https://dns.quad9.net/dns-query", + "t0": 0.000463, + "t": 0.033146, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [], + "x_control_request": { + "http_request": "http://www.example.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": [ + "127.0.0.1:443", + "127.0.0.1:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": {}, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "unknown_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "127.0.0.1" + ] + }, + "ip_info": { + "127.0.0.1": { + "asn": 0, + "flags": 7 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:127.0.0.1 Flags:7}]", + "t": 0.033288 + } + ], + "control_failure": null, + "x_dns_flags": 1, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.507594, + "test_start_time": "2024-01-24 12:33:07", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations.json new file mode 100644 index 0000000000..bb838e0d8d --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations.json @@ -0,0 +1,239 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "doh", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 3, + "TagFetchBody": null, + "DNSTransactionID": 3, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "doh", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations_classic.json new file mode 100644 index 0000000000..149205aef1 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTP/observations_classic.json @@ -0,0 +1,58 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis.json new file mode 100644 index 0000000000..bebe05a373 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis.json @@ -0,0 +1,193 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + }, + "DNSLookupSuccess": [ + 1, + 2 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1, + 2 + ], + "DNSLookupSuccessWithBogonAddresses": [ + 1, + 2 + ], + "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": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis_classic.json new file mode 100644 index 0000000000..31fed35b4b --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/analysis_classic.json @@ -0,0 +1,99 @@ +{ + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + }, + "DNSLookupSuccess": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddresses": [], + "DNSLookupSuccessWithValidAddress": [ + 1 + ], + "DNSLookupSuccessWithBogonAddresses": [ + 1 + ], + "DNSLookupSuccessWithInvalidAddressesClassic": [], + "DNSLookupSuccessWithValidAddressClassic": [ + 1 + ], + "DNSLookupUnexpectedFailure": [], + "DNSLookupUnexplainedFailure": [], + "DNSExperimentFailure": null, + "DNSLookupExpectedFailure": [], + "DNSLookupExpectedSuccess": [], + "TCPConnectExpectedFailure": [], + "TCPConnectUnexpectedFailure": [], + "TCPConnectUnexpectedFailureDuringWebFetch": [], + "TCPConnectUnexpectedFailureDuringConnectivityCheck": [], + "TCPConnectUnexplainedFailure": [], + "TCPConnectUnexplainedFailureDuringWebFetch": [], + "TCPConnectUnexplainedFailureDuringConnectivityCheck": [], + "TLSHandshakeExpectedFailure": [], + "TLSHandshakeUnexpectedFailure": [], + "TLSHandshakeUnexpectedFailureDuringWebFetch": [], + "TLSHandshakeUnexpectedFailureDuringConnectivityCheck": [], + "TLSHandshakeUnexplainedFailure": [], + "TLSHandshakeUnexplainedFailureDuringWebFetch": [], + "TLSHandshakeUnexplainedFailureDuringConnectivityCheck": [], + "HTTPRoundTripUnexpectedFailure": [], + "HTTPRoundTripUnexplainedFailure": [], + "HTTPFinalResponseSuccessTLSWithoutControl": null, + "HTTPFinalResponseSuccessTLSWithControl": null, + "HTTPFinalResponseSuccessTCPWithoutControl": null, + "HTTPFinalResponseSuccessTCPWithControl": null, + "HTTPFinalResponseDiffBodyProportionFactor": null, + "HTTPFinalResponseDiffStatusCodeMatch": null, + "HTTPFinalResponseDiffTitleDifferentLongWords": null, + "HTTPFinalResponseDiffUncommonHeadersIntersection": null, + "Linear": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ] +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/measurement.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/measurement.json new file mode 100644 index 0000000000..374b3685e7 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/measurement.json @@ -0,0 +1,262 @@ +{ + "data_format_version": "0.2.0", + "extensions": { + "dnst": 0, + "httpt": 0, + "netevents": 0, + "tcpconnect": 0, + "tlshandshake": 0, + "tunnel": 0 + }, + "input": "https://www.example.com/", + "measurement_start_time": "2024-01-24 12:33:08", + "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": [], + "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.000107, + "t": 0.000107, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000708, + "t": 0.000766, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "write", + "proto": "udp", + "t0": 0.000735, + "t": 0.000865, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 33, + "operation": "read", + "proto": "udp", + "t0": 0.000777, + "t": 0.006738, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "address": "8.8.4.4:53", + "failure": null, + "num_bytes": 64, + "operation": "read", + "proto": "udp", + "t0": 0.00105, + "t": 0.00687, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + }, + { + "failure": null, + "operation": "resolve_done", + "t0": 0.006903, + "t": 0.006903, + "transaction_id": 2, + "tags": [ + "depth=0" + ] + } + ], + "queries": [] + }, + "x_dns_duplicate_responses": [], + "queries": [ + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "getaddrinfo", + "failure": null, + "hostname": "www.example.com", + "query_type": "ANY", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "", + "t0": 0.000081, + "t": 0.005927, + "tags": [ + "depth=0" + ], + "transaction_id": 1 + }, + { + "answers": null, + "engine": "udp", + "failure": "dns_no_answer", + "hostname": "www.example.com", + "query_type": "AAAA", + "raw_response": "A5+BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAHAAB", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000117, + "t": 0.006744, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + }, + { + "answers": [ + { + "answer_type": "A", + "ipv4": "127.0.0.1", + "ttl": null + } + ], + "engine": "udp", + "failure": null, + "hostname": "www.example.com", + "query_type": "A", + "raw_response": "imKBAAABAAEAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQABA3d3dwdleGFtcGxlA2NvbQAAAQABAAAOEAAEfwAAAQ==", + "resolver_hostname": null, + "resolver_port": null, + "resolver_address": "8.8.4.4:53", + "t0": 0.000118, + "t": 0.006876, + "tags": [ + "depth=0" + ], + "transaction_id": 2 + } + ], + "requests": [], + "tcp_connect": [], + "tls_handshakes": [], + "x_control_request": { + "http_request": "https://www.example.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": [ + "127.0.0.1:443", + "127.0.0.1:80" + ], + "x_quic_enabled": false + }, + "control": { + "tcp_connect": {}, + "quic_handshake": {}, + "http_request": { + "body_length": -1, + "discovered_h3_endpoint": "", + "failure": "unknown_error", + "title": "", + "headers": {}, + "status_code": -1 + }, + "http3_request": null, + "dns": { + "failure": null, + "addrs": [ + "127.0.0.1" + ] + }, + "ip_info": { + "127.0.0.1": { + "asn": 0, + "flags": 7 + } + } + }, + "x_conn_priority_log": [ + { + "msg": "create with [{Addr:127.0.0.1 Flags:3}]", + "t": 0.011572 + } + ], + "control_failure": null, + "x_dns_flags": 1, + "dns_experiment_failure": null, + "dns_consistency": "consistent", + "http_experiment_failure": null, + "x_blocking_flags": 0, + "x_null_null_flags": 0, + "body_proportion": 0, + "body_length_match": null, + "headers_match": null, + "status_code_match": null, + "title_match": null, + "blocking": false, + "accessible": false + }, + "test_name": "web_connectivity", + "test_runtime": 0.507, + "test_start_time": "2024-01-24 12:33:08", + "test_version": "0.5.28" +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations.json new file mode 100644 index 0000000000..3cb90f6ab5 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations.json @@ -0,0 +1,149 @@ +{ + "DNSLookupFailures": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "dns_no_answer", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "dns_no_answer", + "DNSQueryType": "AAAA", + "DNSEngine": "udp", + "DNSResolvedAddrs": 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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + }, + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 2, + "TagFetchBody": null, + "DNSTransactionID": 2, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "A", + "DNSEngine": "udp", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + } +} \ No newline at end of file diff --git a/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations_classic.json b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations_classic.json new file mode 100644 index 0000000000..149205aef1 --- /dev/null +++ b/internal/minipipeline/testdata/webconnectivity/generated/localhostWithHTTPS/observations_classic.json @@ -0,0 +1,58 @@ +{ + "DNSLookupFailures": [], + "DNSLookupSuccesses": [ + { + "TagDepth": 0, + "Type": 0, + "Failure": "", + "TransactionID": 1, + "TagFetchBody": null, + "DNSTransactionID": 1, + "DNSDomain": "www.example.com", + "DNSLookupFailure": "", + "DNSQueryType": "ANY", + "DNSEngine": "getaddrinfo", + "DNSResolvedAddrs": [ + "127.0.0.1" + ], + "IPAddress": "127.0.0.1", + "IPAddressASN": null, + "IPAddressBogon": true, + "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": "www.example.com", + "ControlDNSLookupFailure": "", + "ControlDNSResolvedAddrs": [ + "127.0.0.1" + ], + "ControlTCPConnectFailure": null, + "ControlTLSHandshakeFailure": null, + "ControlHTTPFailure": "unknown_error", + "ControlHTTPResponseStatusCode": null, + "ControlHTTPResponseBodyLength": null, + "ControlHTTPResponseHeadersKeys": null, + "ControlHTTPResponseTitle": null + } + ], + "KnownTCPEndpoints": {}, + "ControlExpectations": { + "DNSAddresses": [ + "127.0.0.1" + ], + "FinalResponseFailure": "unknown_error" + } +} \ No newline at end of file