summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWofWca <wofwca@protonmail.com>2023-10-02 21:26:13 +0400
committerWofWca <wofwca@protonmail.com>2023-10-02 21:39:56 +0400
commit4ff36e3f071bd21cd2d2292b952fdc9430c99934 (patch)
treee67a00c3d579836f7cb05155a0c62586f926fde3
parent5cdf52c8138c691d25a37e58b521ddc57f1faa97 (diff)
downloadsnowflake-4ff36e3f071bd21cd2d2292b952fdc9430c99934.tar.gz
snowflake-4ff36e3f071bd21cd2d2292b952fdc9430c99934.zip
improvement(broker): don't reject unrestricted client if there are no restricted proxies
I.e. match it with an unrestricted proxy (if there is one). The old behavior exists since the inception of the restricted vs unrestricted feature, i.e. 0052c0e10c
-rw-r--r--broker/ipc.go21
-rw-r--r--broker/snowflake-broker_test.go24
2 files changed, 33 insertions, 12 deletions
diff --git a/broker/ipc.go b/broker/ipc.go
index b77c579..94ea53e 100644
--- a/broker/ipc.go
+++ b/broker/ipc.go
@@ -234,22 +234,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