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
This commit is contained in:
WofWca 2023-10-02 21:26:13 +04:00
parent 5cdf52c813
commit 4ff36e3f07
2 changed files with 33 additions and 12 deletions

View file

@ -234,22 +234,19 @@ func (i *IPC) ClientOffers(arg messages.Arg, response *[]byte) error {
} }
func (i *IPC) matchSnowflake(natType string) *Snowflake { 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() i.ctx.snowflakeLock.Lock()
defer i.ctx.snowflakeLock.Unlock() defer i.ctx.snowflakeLock.Unlock()
if snowflakeHeap.Len() > 0 { // Proiritize known restricted snowflakes for unrestricted clients
return heap.Pop(snowflakeHeap).(*Snowflake) if natType == NATUnrestricted && i.ctx.restrictedSnowflakes.Len() > 0 {
} else { return heap.Pop(i.ctx.restrictedSnowflakes).(*Snowflake)
return nil
} }
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 { func (i *IPC) ProxyAnswers(arg messages.Arg, response *[]byte) error {

View file

@ -167,6 +167,30 @@ func TestBroker(t *testing.T) {
So(w.Code, ShouldEqual, http.StatusOK) 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() { Convey("Times out when no proxy responds.", func() {
if testing.Short() { if testing.Short() {
return return