Making Tor HTTP Requests with Go

Go provides standard packages for working with HTTP, URLs, and proxies. Below is an example of how to make an HTTP request using a Tor proxy with the Go programming language. The key difference from making a standard HTTP request is that you must configure the HTTP client to use the proxy. This is done by creating a proxy dialer, creating an HTTP transport that uses that proxy dialer, and then creating an HTTP client that uses that transport. Check out the example below.

If you do not already have Tor setup, you can follow these instructions for setting up Tor in Linux or download the Tor Browser Bundle.

package main

import (
"io/ioutil"
"log"
"net/http"
"net/url"
"time"

"golang.org/x/net/proxy"
)

// URL to fetch
var webUrl string = "https://check.torproject.org"

// Specify Tor proxy ip and port
var torProxy string = "socks5://127.0.0.1:9050" // 9150 w/ Tor Browser

func main() {
// Parse Tor proxy URL string to a URL type
torProxyUrl, err := url.Parse(torProxy)
if err != nil {
log.Fatal("Error parsing Tor proxy URL:", torProxy, ".", err)
}

// Create proxy dialer using Tor SOCKS proxy
torDialer, err := proxy.FromURL(torProxyUrl, proxy.Direct)
if err != nil {
log.Fatal("Error setting Tor proxy.", err)
}

// Set up a custom HTTP transport to use the proxy and create the client
torTransport := &http.Transport{Dial: torDialer.Dial}
client := &http.Client{Transport: torTransport, Timeout: time.Second * 5}

// Make request
resp, err := client.Get(webUrl)
if err != nil {
log.Fatal("Error making GET request.", err)
}
defer resp.Body.Close()

// Read response
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Error reading body of response.", err)
}
log.Println(string(body))
log.Println("Return status code:", resp.StatusCode)
}

Reference