diff options
author | meskio <meskio@torproject.org> | 2023-10-26 18:47:01 +0200 |
---|---|---|
committer | meskio <meskio@torproject.org> | 2023-10-26 18:47:01 +0200 |
commit | 778e3af09a4e30ed8339a711f73e70fb1cc6cb23 (patch) | |
tree | 0467211142770eabab7d399a7dab7c868c05ffcb | |
parent | 4fa43a88927e42fb2e3864f706d3e3c72fd0dca3 (diff) | |
parent | 4ff36e3f071bd21cd2d2292b952fdc9430c99934 (diff) | |
download | snowflake-778e3af09a4e30ed8339a711f73e70fb1cc6cb23.tar.gz snowflake-778e3af09a4e30ed8339a711f73e70fb1cc6cb23.zip |
Merge remote-tracking branch 'gitlab/mr/187'
-rw-r--r-- | broker/ipc.go | 21 | ||||
-rw-r--r-- | broker/snowflake-broker_test.go | 24 |
2 files changed, 33 insertions, 12 deletions
diff --git a/broker/ipc.go b/broker/ipc.go index 7cbdd06..132dba7 100644 --- a/broker/ipc.go +++ b/broker/ipc.go @@ -233,22 +233,19 @@ func (i *IPC) ClientOffers(arg messages.Arg, response *[]byte) error { } func (i *IPC) matchSnowflake(natType string) *Snowflake { - // Only hand out known restricted snowflakes to unrestricted clients - var snowflakeHeap *SnowflakeHeap - if natType == NATUnrestricted { - snowflakeHeap = i.ctx.restrictedSnowflakes - } else { - snowflakeHeap = i.ctx.snowflakes - } - i.ctx.snowflakeLock.Lock() defer i.ctx.snowflakeLock.Unlock() - if snowflakeHeap.Len() > 0 { - return heap.Pop(snowflakeHeap).(*Snowflake) - } else { - return nil + // Proiritize known restricted snowflakes for unrestricted clients + if natType == NATUnrestricted && i.ctx.restrictedSnowflakes.Len() > 0 { + return heap.Pop(i.ctx.restrictedSnowflakes).(*Snowflake) } + + if i.ctx.snowflakes.Len() > 0 { + return heap.Pop(i.ctx.snowflakes).(*Snowflake) + } + + return nil } func (i *IPC) ProxyAnswers(arg messages.Arg, response *[]byte) error { diff --git a/broker/snowflake-broker_test.go b/broker/snowflake-broker_test.go index b42e094..e335258 100644 --- a/broker/snowflake-broker_test.go +++ b/broker/snowflake-broker_test.go @@ -167,6 +167,30 @@ func TestBroker(t *testing.T) { So(w.Code, ShouldEqual, http.StatusOK) }) + Convey("with unrestricted proxy to unrestricted client if there are no restricted proxies", func() { + snowflake := ctx.AddSnowflake("test", "", NATUnrestricted, 0) + offerData, err := createClientOffer(sdp, NATUnrestricted, "") + So(err, ShouldBeNil) + r, err := http.NewRequest("POST", "snowflake.broker/client", offerData) + + done := make(chan bool) + go func() { + clientOffers(i, w, r) + done <- true + }() + + select { + case <-snowflake.offerChannel: + case <-time.After(250 * time.Millisecond): + So(false, ShouldBeTrue) + return + } + snowflake.answerChannel <- "test answer" + + <-done + So(w.Body.String(), ShouldEqual, `{"answer":"test answer"}`) + }) + Convey("Times out when no proxy responds.", func() { if testing.Short() { return |