- Nov 11, 2021
-
- Oct 04, 2021
-
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
Follow best practices for documenting the exported pieces of the Snowflake client library.
-
Cecylia Bocovich authored
Add exported functions to the snowflake client library to allow calling programs to define and set their own custom broker rendezvous methods.
-
Cecylia Bocovich authored
-
- Sep 30, 2021
-
-
Cecylia Bocovich authored
-
- Aug 24, 2021
-
-
Cecylia Bocovich authored
-
- Aug 20, 2021
-
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
Parsing the Snowflake client options from SOCKS allow us to specify snowflake client settings in the bridge lines.
-
Cecylia Bocovich authored
-
- Aug 10, 2021
-
-
Cecylia Bocovich authored
This should increase the maximum amount of inflight data and hopefully the performance of Snowflake, especially for clients geographically distant from proxies and the server.
-
- Aug 05, 2021
-
-
David Fifield authored
-
David Fifield authored
-
David Fifield authored
Currently the same as httpRendezvous, but activated using the -ampcache command-line option.
-
David Fifield authored
Makes BrokerChannel abstract over a rendezvousMethod. BrokerChannel itself is responsible for keepLocalAddresses and the NAT type state, as well as encoding and decoding client poll messages. rendezvousMethod is only responsible for delivery of encoded messages.
-
David Fifield authored
Formerly, BrokerChannel represented the broker URL and possible domain fronting as bc.url *url.URL bc.Host string That is, bc.url is the URL of the server which we contact directly, and bc.Host is the Host header to use in the request. With no domain fronting, bc.url points directly at the broker itself, and bc.Host is blank. With domain fronting, we do the following reshuffling: if front != "" { bc.Host = bc.url.Host bc.url.Host = front } That is, we alter bc.url to reflect that the server to which we send requests directly is the CDN, not the broker, and store the broker's own URL in the HTTP Host header. The above representation was always confusing to me, because in my mental model, we are always conceptually communicating with the broker; but we may optionally be using a CDN proxy in the middle. The new representation is bc.url *url.URL bc.front string bc.url is the URL of the broker itself, and never changes. bc.front is the optional CDN front domain, and likewise never changes after initialization. When domain fronting is in use, we do the swap in the http.Request struct, not in BrokerChannel itself: if bc.front != "" { request.Host = request.URL.Host request.URL.Host = bc.front } Compare to the representation in meek-client: https://gitweb.torproject.org/pluggable-transports/meek.git/tree/meek-client/meek-client.go?h=v0.35.0#n94 var options struct { URL string Front string } https://gitweb.torproject.org/pluggable-transports/meek.git/tree/meek-client/meek-client.go?h=v0.35.0#n308 if ok { // if front is set info.Host = info.URL.Host info.URL.Host = front }
-
David Fifield authored
The tests were using a broker URL of "test.broker" (i.e., a schema-less, host-less, relative path), and running assertions on the value of b.url.Path. This is strange, especially in tests regarding domain fronting, where we care about b.url.Host, not b.url.Path. This commit changes the broker URL to "http://test.broker" and changes tests to check b.url.Host. I also added an additional assertion for an empty b.Host in the non-domain-fronted case.
-
- Jul 19, 2021
-
-
Cecylia Bocovich authored
-
- Jul 18, 2021
-
-
David Fifield authored
Instead of copying the value.
-
David Fifield authored
Unused since 1364d7d4.
-
- Jun 24, 2021
-
-
Cecylia Bocovich authored
Remove the -max 3 option because we only use one snowflake. Add SocksPort auto because many testers have a tor process already bound to port 9050.
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
We used a WaitGroup to prevent a call to Peers.End from melting snowflakes while a new one is being collected. However, calls to WaitGroup.Add are in a race with WaitGroup.Wait. To fix this, we use a Mutex instead.
-
Cecylia Bocovich authored
-
Cecylia Bocovich authored
Using the boolean value was unnecessary since we already have a channel we can check for closure.
-
Cecylia Bocovich authored
The race condition occurs because concurrent goroutines are intermixing reads and writes of `WebRTCPeer.closed`. Spotted when integrating Snowflake inside OONI in https://github.com/ooni/probe-cli/pull/373.
-
The race condition occurs because concurrent goroutines are intermixing reads and writes of `WebRTCPeer.lastReceive`. Spotted when integrating Snowflake inside OONI in https://github.com/ooni/probe-cli/pull/373.
-
- Jun 14, 2021
-
-
sbs authored
In VSCode, the staticcheck tool emits this warning: > should call wg.Add(1) before starting the goroutine to > avoid a race (SA2000)go-staticcheck To avoid this warning, just move wg.Add outside.
-
- Jun 02, 2021
-
-
Cecylia Bocovich authored
Send the client poll request and response in a json-encoded format in the HTTP request body rather than sending the data in HTTP headers. This will pave the way for using domain-fronting alternatives for the Snowflake rendezvous.
-
- May 24, 2021
-
-
David Fifield authored
Make a stack of cleanup functions to run (as with defer), but clear the stack before returning if no error occurs. Uselessly pushing the stream.Close() cleanup just before clearing the stack is an intentional safeguard, for in case additional operations are added before the return in the future. Fixes #40042.
-
David Fifield authored
The code checked for and displayed an error, but would then go on to call copyLoop on the nil Conn returned from transport.Dial. Add a return in that case, and put the cleanup operations in defer. Also remove an obsolete comment about an empty address. Obsolete because: tpo/anti-censorship/pluggable-transports/snowflake!31 (comment 2733279)
-
- May 12, 2021
-
-
Cecylia Bocovich authored
This implements a pluggable transports v2.1 compatible Go API in the Snowflake client library, and refactors how the main Snowflake program calls it. The Go API implements the two required client side functions: a constructor that returns a Transport, and a Dial function for the Transport that returns a net.Conn. See the PT specification for more information: https://github.com/Pluggable-Transports/Pluggable-Transports-spec/blob/master/releases/PTSpecV2.1/Pluggable%20Transport%20Specification%20v2.1%20-%20Go%20Transport%20API.pdf
-
- Apr 01, 2021
-
-
Cecylia Bocovich authored
-
- Jan 12, 2021
-
-
Cecylia Bocovich authored
This update required two main changes to how we use the library. First, we had to make sure we created the datachannel on the offering peer side before creating the offer. Second, we had to make sure we wait for the gathering of all candidates to complete since trickle-ice is enabled by default. See the release notes for more details: https://github.com/pion/webrtc/wiki/Release-WebRTC@v3.0.0.
-
- Dec 17, 2020
-
-
Cecylia Bocovich authored
-
- Dec 16, 2020
-
-
Cecylia Bocovich authored
This fixes a bug where we were passing the lock by value to socksAcceptLoop.
-
- Dec 05, 2020
-
-
Cecylia Bocovich authored
Run the snowflake collection ReconnectTimeout timer in parallel to the negotiation with the broker. This way, if the broker takes a long time to respond the client doesn't have to wait the full timeout to respond.
-
Cecylia Bocovich authored
-