Skip to content

Commit

Permalink
Ws read/write timeout after 90s
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Zeyla Hellyer committed Jun 7, 2017
1 parent 858bbf2 commit 1700a4a
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion src/gateway/shard.rs
Expand Up @@ -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))
}

0 comments on commit 1700a4a

Please sign in to comment.