Using http.Client
To use Fixie for specific http requests, you can create a custom http.Client
:
package main
import (
"net/url"
"net/http"
"os"
"io/ioutil"
)
func main () {
fixieUrl, err := url.Parse(os.Getenv("FIXIE_URL"))
customClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(fixieUrl)}}
resp, err := customClient.Get("http://welcome.usefixie.com")
if (err != nil) {
println(err.Error())
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
println(string(body))
}
If you intend to use Fixie for all outbound requests, an alternative is to use the HTTP_PROXY
and HTTPS_PROXY
environment variables. Go honors these environment variables by default. You can set HTTP_PROXY
and HTTPS_PROXY
in your application, typically in main.go:
package main
import (
"net/http"
"os"
"io/ioutil"
)
func main () {
os.Setenv("HTTP_PROXY", os.Getenv("FIXIE_URL"))
os.Setenv("HTTPS_PROXY", os.Getenv("FIXIE_URL"))
resp, err := http.Get("http://welcome.usefixie.com")
if (err != nil) {
println(err.Error())
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
println(string(body))
}
Using net/proxy
package
Golang's net/proxy
package provides a Socks5 proxy dialer that can be used with Fixie Socks. This dialer can be used for any TCP connection. The example below uses this to make an HTTP request:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
"golang.org/x/net/proxy"
)
const URL = "http://www.example.com"
func main() {
fixie_data := strings.Split(os.Getenv("FIXIE_SOCKS_HOST"), "@")
fixie_addr := fixie_data[1]
auth_data := strings.Split(fixie_data[0], ":")
auth := proxy.Auth{
User: auth_data[0],
Password: auth_data[1],
}
dialer, err := proxy.SOCKS5("tcp", fixie_addr, &auth, proxy.Direct)
if err != nil {
fmt.Fprintln(os.Stderr, "can't connect to the proxy:", err)
os.Exit(1)
}
httpTransport := &http.Transport{}
httpClient := &http.Client{Transport: httpTransport}
httpTransport.Dial = dialer.Dial
req, err := http.NewRequest("GET", URL, nil)
if err != nil {
fmt.Fprintln(os.Stderr, "can't create request:", err)
os.Exit(2)
}
resp, err := httpClient.Do(req)
if err != nil {
fmt.Fprintln(os.Stderr, "can't GET page:", err)
os.Exit(3)
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Fprintln(os.Stderr, "error reading body:", err)
os.Exit(4)
}
fmt.Println(string(b))
}
Having issues? Please reach out to our team here.