aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-06-06 20:25:45 -0700
committerZeyla Hellyer <[email protected]>2017-06-06 20:25:45 -0700
commit1700a4a9090789d485c190c2a6ccd2c48986f5dd (patch)
tree2619d9c8f00f83d76e9cc5c2c00a65f2ed21788d /src
parentMake client starts return an error (diff)
downloadserenity-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.rs26
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))
}