Edits to the measurex tutorial (#534)
This commit is contained in:
		
							parent
							
								
									1ffb2db0ca
								
							
						
					
					
						commit
						46e00888ae
					
				| @ -30,7 +30,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	query := flag.String("query", "example.com", "domain to resolver") | ||||
| 	query := flag.String("query", "example.com", "domain to resolve") | ||||
| 	address := flag.String("address", "8.8.4.4:53", "DNS-over-UDP server address") | ||||
| 	timeout := flag.Duration("timeout", 60*time.Second, "timeout to use") | ||||
| 	flag.Parse() | ||||
| @ -429,9 +429,9 @@ Here's the corresponding JSON: | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| We see that we do fail with a timeout (I have marked some of them | ||||
| We see that we fail with a timeout (I have marked some of them | ||||
| with comments inside the JSON). We see the timeout at three different | ||||
| level of abstractions (from lower to higher abstraction): at the socket layer, | ||||
| levels of abstractions (from lower to higher abstraction): at the socket layer, | ||||
| during the DNS round trip, during the DNS lookup. | ||||
| 
 | ||||
| What we also see is that `t`'s value is ~5s when the `read` event | ||||
| @ -562,6 +562,6 @@ Here's the answer I get: | ||||
| 
 | ||||
| ## Conclusion | ||||
| 
 | ||||
| We have seen how we sending DNS queries over UDP, measure the | ||||
| We have seen how to send DNS queries over UDP, measure the | ||||
| results, and what happens on common error conditions. | ||||
| 
 | ||||
|  | ||||
| @ -31,7 +31,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	query := flag.String("query", "example.com", "domain to resolver") | ||||
| 	query := flag.String("query", "example.com", "domain to resolve") | ||||
| 	address := flag.String("address", "8.8.4.4:53", "DNS-over-UDP server address") | ||||
| 	timeout := flag.Duration("timeout", 60*time.Second, "timeout to use") | ||||
| 	flag.Parse() | ||||
| @ -430,9 +430,9 @@ func main() { | ||||
| // } | ||||
| // ``` | ||||
| // | ||||
| // We see that we do fail with a timeout (I have marked some of them | ||||
| // We see that we fail with a timeout (I have marked some of them | ||||
| // with comments inside the JSON). We see the timeout at three different | ||||
| // level of abstractions (from lower to higher abstraction): at the socket layer, | ||||
| // levels of abstractions (from lower to higher abstraction): at the socket layer, | ||||
| // during the DNS round trip, during the DNS lookup. | ||||
| // | ||||
| // What we also see is that `t`'s value is ~5s when the `read` event | ||||
| @ -563,7 +563,7 @@ func main() { | ||||
| // | ||||
| // ## Conclusion | ||||
| // | ||||
| // We have seen how we sending DNS queries over UDP, measure the | ||||
| // We have seen how to send DNS queries over UDP, measure the | ||||
| // results, and what happens on common error conditions. | ||||
| // | ||||
| // -=-=- StopHere -=-=- | ||||
|  | ||||
| @ -192,8 +192,8 @@ https://github.com/ooni/spec/tree/master/data-formats. | ||||
| ### Suggested follow-up experiments | ||||
| 
 | ||||
| Try to run experiments in the following scenarios, and | ||||
| check the output JSON to familiarize with what changes in | ||||
| different error conditions. | ||||
| check the output JSON to familiarize yourself with what | ||||
| changes in different error conditions. | ||||
| 
 | ||||
| 1. measurement that causes timeout | ||||
| 
 | ||||
| @ -217,7 +217,7 @@ Here are the commands I used for each proposed exercise: | ||||
| 
 | ||||
| 4. go run -race ./internal/tutorial/measurex/chapter04 -address 104.154.89.105:443 -sni expire.badssl.com | ||||
| 
 | ||||
| To emulate the two last scenario, if you're on Linux, a | ||||
| To emulate the last two scenarios, if you're on Linux, a | ||||
| possibility is building Jafar with this command: | ||||
| 
 | ||||
| ``` | ||||
| @ -243,5 +243,5 @@ Likewise, you can obtain a timeout using the | ||||
| ## Conclusion | ||||
| 
 | ||||
| We have seen how to measure TLS handshakes. We have seen how | ||||
| this flow produces different output on different error conditions. | ||||
| this flow produces a different output on different error conditions. | ||||
| 
 | ||||
|  | ||||
| @ -193,8 +193,8 @@ func main() { | ||||
| // ### Suggested follow-up experiments | ||||
| // | ||||
| // Try to run experiments in the following scenarios, and | ||||
| // check the output JSON to familiarize with what changes in | ||||
| // different error conditions. | ||||
| // check the output JSON to familiarize yourself with what  | ||||
| // changes in different error conditions. | ||||
| // | ||||
| // 1. measurement that causes timeout | ||||
| // | ||||
| @ -218,7 +218,7 @@ func main() { | ||||
| // | ||||
| // 4. go run -race ./internal/tutorial/measurex/chapter04 -address 104.154.89.105:443 -sni expire.badssl.com | ||||
| // | ||||
| // To emulate the two last scenario, if you're on Linux, a | ||||
| // To emulate the last two scenarios, if you're on Linux, a | ||||
| // possibility is building Jafar with this command: | ||||
| // | ||||
| // ``` | ||||
| @ -244,6 +244,6 @@ func main() { | ||||
| // ## Conclusion | ||||
| // | ||||
| // We have seen how to measure TLS handshakes. We have seen how | ||||
| // this flow produces different output on different error conditions. | ||||
| // this flow produces a different output on different error conditions. | ||||
| // | ||||
| // -=-=- StopHere -=-=- | ||||
|  | ||||
| @ -10,7 +10,7 @@ For this reason, we will not see a connect event, but we | ||||
| will only see a "QUIC handshake event". | ||||
| 
 | ||||
| Having said that, let us now move on and see the code of | ||||
| the simple program that shows this functionality. | ||||
| the simple program that uses this functionality. | ||||
| 
 | ||||
| (This file is auto-generated. Do not edit it directly! To apply | ||||
| changes you need to modify `./internal/tutorial/measure/chapter05/main.go`.) | ||||
| @ -63,7 +63,7 @@ The same remarks mentioned in the previous chapter regarding | ||||
| the arguments for the TLS config also apply here. We need | ||||
| to specify the SNI (`ServerName`), the ALPN (`NextProtos`), | ||||
| and the CA pool we want to use. Here, again, we're using | ||||
| the CA pool from cURL that we bundle with ooniprobe. | ||||
| the CA pool from cURL that we bundle with OONI Probe. | ||||
| 
 | ||||
| As we did in the previous chapters, here's the usual three | ||||
| lines of code for printing the resulting measurement. | ||||
| @ -224,7 +224,7 @@ Produces this JSON: | ||||
|   ], | ||||
| 
 | ||||
|   // This section describes the QUIC handshake and it has | ||||
|   // basically the same fields of the TLS handshake. | ||||
|   // basically the same fields as the TLS handshake. | ||||
|   "quic_handshake": [ | ||||
|     { | ||||
|       "cipher_suite": "TLS_CHACHA20_POLY1305_SHA256", | ||||
| @ -260,9 +260,9 @@ Produces this JSON: | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| Here are some suggestions on other experiments to run: | ||||
| Here are some suggestions for other experiments to run: | ||||
| 
 | ||||
| 1. obtain a timeout by connecting on a port that is not | ||||
| 1. obtain a timeout by connecting to a port that is not | ||||
| actually listening for QUIC; | ||||
| 
 | ||||
| 2. obtain a certificate validation error by forcing | ||||
| @ -271,7 +271,7 @@ a different SNI; | ||||
| 3. use a different ALPN (by changing the code), and see | ||||
| how the error and the oddity are handled. Can we do | ||||
| anything about this by changing `./internal/netxlite/errorx` | ||||
| to better support for this specific error condition? | ||||
| to better support this specific error condition? | ||||
| 
 | ||||
| ## Conclusion | ||||
| 
 | ||||
|  | ||||
| @ -11,7 +11,7 @@ | ||||
| // will only see a "QUIC handshake event". | ||||
| // | ||||
| // Having said that, let us now move on and see the code of | ||||
| // the simple program that shows this functionality. | ||||
| // the simple program that uses this functionality. | ||||
| // | ||||
| // (This file is auto-generated. Do not edit it directly! To apply | ||||
| // changes you need to modify `./internal/tutorial/measure/chapter05/main.go`.) | ||||
| @ -64,7 +64,7 @@ func main() { | ||||
| 	// the arguments for the TLS config also apply here. We need | ||||
| 	// to specify the SNI (`ServerName`), the ALPN (`NextProtos`), | ||||
| 	// and the CA pool we want to use. Here, again, we're using | ||||
| 	// the CA pool from cURL that we bundle with ooniprobe. | ||||
| 	// the CA pool from cURL that we bundle with OONI Probe. | ||||
| 	// | ||||
| 	// As we did in the previous chapters, here's the usual three | ||||
| 	// lines of code for printing the resulting measurement. | ||||
| @ -225,7 +225,7 @@ func main() { | ||||
| //   ], | ||||
| // | ||||
| //   // This section describes the QUIC handshake and it has | ||||
| //   // basically the same fields of the TLS handshake. | ||||
| //   // basically the same fields as the TLS handshake. | ||||
| //   "quic_handshake": [ | ||||
| //     { | ||||
| //       "cipher_suite": "TLS_CHACHA20_POLY1305_SHA256", | ||||
| @ -261,9 +261,9 @@ func main() { | ||||
| // } | ||||
| // ``` | ||||
| // | ||||
| // Here are some suggestions on other experiments to run: | ||||
| // Here are some suggestions for other experiments to run: | ||||
| // | ||||
| // 1. obtain a timeout by connecting on a port that is not | ||||
| // 1. obtain a timeout by connecting to a port that is not | ||||
| // actually listening for QUIC; | ||||
| // | ||||
| // 2. obtain a certificate validation error by forcing | ||||
| @ -272,7 +272,7 @@ func main() { | ||||
| // 3. use a different ALPN (by changing the code), and see | ||||
| // how the error and the oddity are handled. Can we do | ||||
| // anything about this by changing `./internal/netxlite/errorx` | ||||
| // to better support for this specific error condition? | ||||
| // to better support this specific error condition? | ||||
| // | ||||
| // ## Conclusion | ||||
| // | ||||
|  | ||||
| @ -1,15 +1,15 @@ | ||||
| 
 | ||||
| # Chapter VI: Getting a webpage from an HTTP/HTTPS/HTTP3 endpoint. | ||||
| 
 | ||||
| This chapter describes measuring getting a webpage from an | ||||
| This chapter describes measuring the retrieval of a webpage from an | ||||
| HTTPS endpoint. We have seen how to TCP connect, we have | ||||
| seen how to TLS handshake, now it's time to see how we can | ||||
| combine these operations with fetching a webpage from a | ||||
| given TCP endpoint speaking HTTP and TLS. (As well as to | ||||
| provide you with information on how to otherwise fetch | ||||
| combine these operations with that of fetching a webpage from a | ||||
| given TCP endpoint speaking HTTP and TLS. (As well as | ||||
| providing you with information on how to otherwise fetch | ||||
| from HTTP and HTTP/3 endpoints.) | ||||
| 
 | ||||
| The program we're going to write, `main.go`, will show a | ||||
| The program we're going to write, `main.go`, will use a | ||||
| high-level operation to perform this measurement in a | ||||
| single API call. The code implementing this API call will | ||||
| combine the operations we have seen in previous chapter | ||||
|  | ||||
| @ -2,15 +2,15 @@ | ||||
| // | ||||
| // # Chapter VI: Getting a webpage from an HTTP/HTTPS/HTTP3 endpoint. | ||||
| // | ||||
| // This chapter describes measuring getting a webpage from an | ||||
| // This chapter describes measuring the retrieval of a webpage from an | ||||
| // HTTPS endpoint. We have seen how to TCP connect, we have | ||||
| // seen how to TLS handshake, now it's time to see how we can | ||||
| // combine these operations with fetching a webpage from a | ||||
| // given TCP endpoint speaking HTTP and TLS. (As well as to | ||||
| // provide you with information on how to otherwise fetch | ||||
| // combine these operations with that of fetching a webpage from a | ||||
| // given TCP endpoint speaking HTTP and TLS. (As well as | ||||
| // providing you with information on how to otherwise fetch | ||||
| // from HTTP and HTTP/3 endpoints.) | ||||
| // | ||||
| // The program we're going to write, `main.go`, will show a | ||||
| // The program we're going to write, `main.go`, will use a | ||||
| // high-level operation to perform this measurement in a | ||||
| // single API call. The code implementing this API call will | ||||
| // combine the operations we have seen in previous chapter | ||||
|  | ||||
| @ -58,7 +58,7 @@ func main() { | ||||
| ``` | ||||
| ### Call LookupHTTPSSvc | ||||
| 
 | ||||
| Here we perform the `LookupHostUDP` we performed in the | ||||
| Here we perform the `LookupHostUDP` we used in the | ||||
| previous chapter and then we call `LookupHTTPSvcUDP`. | ||||
| 
 | ||||
| ```Go | ||||
| @ -67,7 +67,7 @@ previous chapter and then we call `LookupHTTPSvcUDP`. | ||||
| ``` | ||||
| 
 | ||||
| The `LookupHTTPSSvcUDP` function has the same signature | ||||
| of `LookupHostUDP` _but_ it behaves differently. Rather than | ||||
| as `LookupHostUDP` _but_ it behaves differently. Rather than | ||||
| querying for `A` and `AAAA`, it performs an `HTTPS` DNS | ||||
| lookup. This query returns: | ||||
| 
 | ||||
| @ -80,7 +80,7 @@ lookup. This query returns: | ||||
| ### Build an []HTTPEndpoint and run serial measurements | ||||
| 
 | ||||
| Here we call `AllHTTPEndpointsForURL` like we did in the | ||||
| previous chapter. However, note that we pass to it the | ||||
| previous chapter. However, note that we pass it the | ||||
| whole content of `m.DNS`, which now contains not only the | ||||
| A/AAAA lookups results but also the HTTPS lookup results. | ||||
| 
 | ||||
|  | ||||
| @ -59,7 +59,7 @@ func main() { | ||||
| 	// ``` | ||||
| 	// ### Call LookupHTTPSSvc | ||||
| 	// | ||||
| 	// Here we perform the `LookupHostUDP` we performed in the | ||||
| 	// Here we perform the `LookupHostUDP` we used in the | ||||
| 	// previous chapter and then we call `LookupHTTPSvcUDP`. | ||||
| 	// | ||||
| 	// ```Go | ||||
| @ -68,7 +68,7 @@ func main() { | ||||
| 	// ``` | ||||
| 	// | ||||
| 	// The `LookupHTTPSSvcUDP` function has the same signature | ||||
| 	// of `LookupHostUDP` _but_ it behaves differently. Rather than | ||||
| 	// as `LookupHostUDP` _but_ it behaves differently. Rather than | ||||
| 	// querying for `A` and `AAAA`, it performs an `HTTPS` DNS | ||||
| 	// lookup. This query returns: | ||||
| 	// | ||||
| @ -81,7 +81,7 @@ func main() { | ||||
| 	// ### Build an []HTTPEndpoint and run serial measurements | ||||
| 	// | ||||
| 	// Here we call `AllHTTPEndpointsForURL` like we did in the | ||||
| 	// previous chapter. However, note that we pass to it the | ||||
| 	// previous chapter. However, note that we pass it the | ||||
| 	// whole content of `m.DNS`, which now contains not only the | ||||
| 	// A/AAAA lookups results but also the HTTPS lookup results. | ||||
| 	// | ||||
|  | ||||
| @ -15,9 +15,9 @@ changes you need to modify `./internal/tutorial/measurex/chapter11/main.go`.) | ||||
| ## main.go | ||||
| 
 | ||||
| The beginning of the program is much simpler. We have removed | ||||
| out custom measurement type. We are now going to use the | ||||
| our custom measurement type. We are now going to use the | ||||
| `URLMeasurement` type (`go doc ./internal/measurex.URLMeasurement`), | ||||
| which as the same fields of `measurement` in chapter10 _plus_ | ||||
| which has the same fields of `measurement` in chapter10 _plus_ | ||||
| some extra fields that we'll examine in a later chapter. | ||||
| 
 | ||||
| ```Go | ||||
| @ -77,7 +77,7 @@ The arguments are: | ||||
| The return value is either an `URLMeasurement` | ||||
| or an error. The error happens, for example, if | ||||
| the input URL scheme is not "http" or "https" (which | ||||
| we handled by panicking in chapter11). | ||||
| we handled by panicking in chapter07). | ||||
| 
 | ||||
| Now, rather than panicking inside `MeasureURL`, we | ||||
| return the error to the caller and we `panic` | ||||
|  | ||||
| @ -16,9 +16,9 @@ | ||||
| // ## main.go | ||||
| // | ||||
| // The beginning of the program is much simpler. We have removed | ||||
| // out custom measurement type. We are now going to use the | ||||
| // our custom measurement type. We are now going to use the | ||||
| // `URLMeasurement` type (`go doc ./internal/measurex.URLMeasurement`), | ||||
| // which as the same fields of `measurement` in chapter10 _plus_ | ||||
| // which has the same fields of `measurement` in chapter10 _plus_ | ||||
| // some extra fields that we'll examine in a later chapter. | ||||
| // | ||||
| // ```Go | ||||
| @ -78,7 +78,7 @@ func main() { | ||||
| 	// The return value is either an `URLMeasurement` | ||||
| 	// or an error. The error happens, for example, if | ||||
| 	// the input URL scheme is not "http" or "https" (which | ||||
| 	// we handled by panicking in chapter11). | ||||
| 	// we handled by panicking in chapter07). | ||||
| 	// | ||||
| 	// Now, rather than panicking inside `MeasureURL`, we | ||||
| 	// return the error to the caller and we `panic` | ||||
|  | ||||
| @ -67,7 +67,7 @@ func webConnectivity(ctx context.Context, URL string) (*measurement, error) { | ||||
| ``` | ||||
| 
 | ||||
| We start by parsing the input URL. If we cannot parse it, of | ||||
| course this is an hard error and we cannot continue. | ||||
| course this is a hard error and we cannot continue. | ||||
| 
 | ||||
| ```Go | ||||
| 	parsedURL, err := url.Parse(URL) | ||||
| @ -100,7 +100,7 @@ the input URL's domain using the system resolver. | ||||
| 
 | ||||
| ``` | ||||
| 
 | ||||
| This is code we have already seen in previous chapter. | ||||
| This is code we have already seen in the previous chapters. | ||||
| 
 | ||||
| 
 | ||||
| ### 2. Building a list of endpoints | ||||
| @ -149,7 +149,7 @@ now focus on the last point: | ||||
| ### 5. HTTP measurement | ||||
| 
 | ||||
| We need to manually build a `MeasurementDB`. This is a | ||||
| "database" where networking code will store events. | ||||
| "database" where the networking code will store events. | ||||
| 
 | ||||
| ```Go | ||||
| 
 | ||||
| @ -190,7 +190,7 @@ the round trip. Reading a snapshot of the response | ||||
| body is not implemented by this function but rather | ||||
| is a property of the "tracing" HTTP transport we | ||||
| created above (this type of transport is the one we | ||||
| have been internally using in all the examples | ||||
| have been using internally in all the examples | ||||
| presented so far.) | ||||
| 
 | ||||
| ```Go | ||||
|  | ||||
| @ -68,7 +68,7 @@ func webConnectivity(ctx context.Context, URL string) (*measurement, error) { | ||||
| 	// ``` | ||||
| 	// | ||||
| 	// We start by parsing the input URL. If we cannot parse it, of | ||||
| 	// course this is an hard error and we cannot continue. | ||||
| 	// course this is a hard error and we cannot continue. | ||||
| 	// | ||||
| 	// ```Go | ||||
| 	parsedURL, err := url.Parse(URL) | ||||
| @ -101,7 +101,7 @@ func webConnectivity(ctx context.Context, URL string) (*measurement, error) { | ||||
| 
 | ||||
| 	// ``` | ||||
| 	// | ||||
| 	// This is code we have already seen in previous chapter. | ||||
| 	// This is code we have already seen in the previous chapters. | ||||
| 	// | ||||
| 	// | ||||
| 	// ### 2. Building a list of endpoints | ||||
| @ -150,7 +150,7 @@ func webConnectivity(ctx context.Context, URL string) (*measurement, error) { | ||||
| 	// ### 5. HTTP measurement | ||||
| 	// | ||||
| 	// We need to manually build a `MeasurementDB`. This is a | ||||
| 	// "database" where networking code will store events. | ||||
| 	// "database" where the networking code will store events. | ||||
| 	// | ||||
| 	// ```Go | ||||
| 
 | ||||
| @ -191,7 +191,7 @@ func webConnectivity(ctx context.Context, URL string) (*measurement, error) { | ||||
| 	// body is not implemented by this function but rather | ||||
| 	// is a property of the "tracing" HTTP transport we | ||||
| 	// created above (this type of transport is the one we | ||||
| 	// have been internally using in all the examples | ||||
| 	// have been using internally in all the examples | ||||
| 	// presented so far.) | ||||
| 	// | ||||
| 	// ```Go | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user