mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-13 20:11:19 -04:00
Randomly select front domain from comma-separated list
This commmit changes the command-line and Bridge line arguments to take a comma-separated list of front domains. The change is backwards compatible with old Bridge and ClientTransportPlugin lines. At rendezvous time, a front domain will be randomly chosen from the list.
This commit is contained in:
parent
5cdf52c813
commit
9fdfb3d1b5
7 changed files with 65 additions and 48 deletions
|
@ -6,29 +6,31 @@ import (
|
|||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
)
|
||||
|
||||
// httpRendezvous is a RendezvousMethod that communicates with the .../client
|
||||
// route of the broker over HTTP or HTTPS, with optional domain fronting.
|
||||
type httpRendezvous struct {
|
||||
brokerURL *url.URL
|
||||
front string // Optional front domain to replace url.Host in requests.
|
||||
fronts []string // Optional front domain to replace url.Host in requests.
|
||||
transport http.RoundTripper // Used to make all requests.
|
||||
}
|
||||
|
||||
// newHTTPRendezvous creates a new httpRendezvous that contacts the broker at
|
||||
// the given URL, with an optional front domain. transport is the
|
||||
// http.RoundTripper used to make all requests.
|
||||
func newHTTPRendezvous(broker, front string, transport http.RoundTripper) (*httpRendezvous, error) {
|
||||
func newHTTPRendezvous(broker string, fronts []string, transport http.RoundTripper) (*httpRendezvous, error) {
|
||||
brokerURL, err := url.Parse(broker)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &httpRendezvous{
|
||||
brokerURL: brokerURL,
|
||||
front: front,
|
||||
fronts: fronts,
|
||||
transport: transport,
|
||||
}, nil
|
||||
}
|
||||
|
@ -36,7 +38,6 @@ func newHTTPRendezvous(broker, front string, transport http.RoundTripper) (*http
|
|||
func (r *httpRendezvous) Exchange(encPollReq []byte) ([]byte, error) {
|
||||
log.Println("Negotiating via HTTP rendezvous...")
|
||||
log.Println("Target URL: ", r.brokerURL.Host)
|
||||
log.Println("Front URL: ", r.front)
|
||||
|
||||
// Suffix the path with the broker's client registration handler.
|
||||
reqURL := r.brokerURL.ResolveReference(&url.URL{Path: "client"})
|
||||
|
@ -45,11 +46,14 @@ func (r *httpRendezvous) Exchange(encPollReq []byte) ([]byte, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if r.front != "" {
|
||||
// Do domain fronting. Replace the domain in the URL's with the
|
||||
// front, and store the original domain the HTTP Host header.
|
||||
if len(r.fronts) != 0 {
|
||||
// Do domain fronting. Replace the domain in the URL's with a randomly
|
||||
// selected front, and store the original domain the HTTP Host header.
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
front := r.fronts[rand.Intn(len(r.fronts))]
|
||||
log.Println("Front URL: ", front)
|
||||
req.Host = req.URL.Host
|
||||
req.URL.Host = r.front
|
||||
req.URL.Host = front
|
||||
}
|
||||
|
||||
resp, err := r.transport.RoundTrip(req)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue