This change ensures that, in turn, we're able to "remote" all the traffic generated by the `geolocate` package, rather than missing some bits of it that were still using the standard library and caused _some_ geolocations to geolocate as the local host rather than as the remote host. Extracted from https://github.com/ooni/probe-cli/pull/969, where we tested this functionality. Closes https://github.com/ooni/probe/issues/1383 (which was long overdue). Part of https://github.com/ooni/probe/issues/2340, because it allows us to make progress with that.
		
			
				
	
	
		
			34 lines
		
	
	
		
			776 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			776 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package geolocate
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"net/http"
 | |
| 	"regexp"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/ooni/probe-cli/v3/internal/httpx"
 | |
| 	"github.com/ooni/probe-cli/v3/internal/model"
 | |
| )
 | |
| 
 | |
| func cloudflareIPLookup(
 | |
| 	ctx context.Context,
 | |
| 	httpClient *http.Client,
 | |
| 	logger model.Logger,
 | |
| 	userAgent string,
 | |
| 	resolver model.Resolver,
 | |
| ) (string, error) {
 | |
| 	data, err := (&httpx.APIClientTemplate{
 | |
| 		BaseURL:    "https://www.cloudflare.com",
 | |
| 		HTTPClient: httpClient,
 | |
| 		Logger:     logger,
 | |
| 		UserAgent:  model.HTTPHeaderUserAgent,
 | |
| 	}).WithBodyLogging().Build().FetchResource(ctx, "/cdn-cgi/trace")
 | |
| 	if err != nil {
 | |
| 		return model.DefaultProbeIP, err
 | |
| 	}
 | |
| 	r := regexp.MustCompile("(?:ip)=(.*)")
 | |
| 	ip := strings.Trim(string(r.Find(data)), "ip=")
 | |
| 	logger.Debugf("cloudflare: body: %s", ip)
 | |
| 	return ip, nil
 | |
| }
 |