diff options
| author | Zeyla Hellyer <[email protected]> | 2017-06-06 20:25:45 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-06-06 20:25:45 -0700 |
| commit | 1700a4a9090789d485c190c2a6ccd2c48986f5dd (patch) | |
| tree | 2619d9c8f00f83d76e9cc5c2c00a65f2ed21788d /src | |
| parent | Make client starts return an error (diff) | |
| download | serenity-1700a4a9090789d485c190c2a6ccd2c48986f5dd.tar.xz serenity-1700a4a9090789d485c190c2a6ccd2c48986f5dd.zip | |
Ws read/write timeout after 90s
Make read/writes to the stream timeout after 90 seconds to prevent a
potentially infinitely blocked call.
If the timeout is reached, perform a reconnect.
This fixes issues such as intermittent internet issues causing a message
to never be received, and thus infinitely blocking.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gateway/shard.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/gateway/shard.rs b/src/gateway/shard.rs index aaebf14..72652b9 100644 --- a/src/gateway/shard.rs +++ b/src/gateway/shard.rs @@ -813,5 +813,29 @@ fn connect(base_url: &str) -> Result<(Sender<WebSocketStream>, Receiver<WebSocke let response = WsClient::connect(url)?.send()?; response.validate()?; - Ok(response.begin().split()) + let (mut sender, mut receiver) = response.begin().split(); + + let timeout = StdDuration::from_secs(90); + + { + let mut ws_stream = receiver.get_mut().get_mut(); + let stream = match *ws_stream { + WebSocketStream::Tcp(ref mut s) => s, + WebSocketStream::Ssl(ref mut s) => s.get_mut(), + }; + + stream.set_read_timeout(Some(timeout))?; + } + + { + let mut ws_stream = sender.get_mut(); + let stream = match *ws_stream { + WebSocketStream::Tcp(ref mut s) => s, + WebSocketStream::Ssl(ref mut s) => s.get_mut(), + }; + + stream.set_read_timeout(Some(timeout))?; + } + + Ok((sender, receiver)) } |