Open Delicious-Bacon opened 12 months ago
In force-pushed amend bece4e813e474b842cb4246af0bbaf216ea89468
:
Fixed a bug:
select {
case <-ctx.Done():
- close(ok)
return nil, ctx.Err()
case <-ok:
}
Added context.DeadlineExceeded
check:
func (c *Client) ConnectToBindContext(ctx context.Context, addr *netutil.PortAddr, local *net.TCPAddr) error {
c.Disconnect()
conn, err := dialTCPContext(ctx, local, addr.ToTCPAddr())
if err != nil {
- if !errors.Is(err, context.Canceled) {
+ if !(errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded)) {
c.Fatalf("Connect failed: %v", err)
}
return err
}
Issue
InitializeSteamDirectory()
returns the list of Steam servers, but some of them are bad and hang until the OS decides to close the connection. This causes issues when using theclient.Connect()
method that decides to pick up a "bad" server:This also causes the client to call
Fatalf()
method and emit Fatal event:Not sure why, but upon calling the
client.Connect()
the next time, it either hangs forever, or manages to connect to a new server (unless it picks up a bad server again), but then panics when trying to login (client.Auth.LogOn()
).This is probably the func that panics with negative index slice slicing (something like s[:-221]):
Proposal
Proposed addition is to add Context aware functions which would let users pass the context with timeout on dial.
It is up to the user on how to handle the
context.Canceled
orcontext.DeadlineExceeded
error.ConnectToBindContext()
would also not emitFatalf()
event error on context cancellation:Context aware functions are tested in the newly added
client_test.go
.Note
One minor thing to note is that the implementation would use a workaround on
net.DialTCP()
becausenet.DialTCPContext()
is accepted, but awaiting implementation in Go (https://go-review.googlesource.com/c/go/+/490975). The only thing this does is that we leave the coroutine waiting for the dial to connect, but the connection, whether connected or not after context times out, is discarded.