Close Websocket when upstream TCP connection is closed
This commit is contained in:
parent
a866deb3e4
commit
dde219a717
@ -4,6 +4,7 @@ use std::time::{Duration, Instant};
|
|||||||
use actix::{Actor, ActorContext, AsyncContext, Handler, Message, StreamHandler};
|
use actix::{Actor, ActorContext, AsyncContext, Handler, Message, StreamHandler};
|
||||||
use actix_web::{Error, HttpRequest, HttpResponse, web};
|
use actix_web::{Error, HttpRequest, HttpResponse, web};
|
||||||
use actix_web_actors::ws;
|
use actix_web_actors::ws;
|
||||||
|
use actix_web_actors::ws::{CloseCode, CloseReason};
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
@ -20,6 +21,9 @@ const CLIENT_TIMEOUT: Duration = Duration::from_secs(60);
|
|||||||
#[rtype(result = "bool")]
|
#[rtype(result = "bool")]
|
||||||
pub struct DataForWebSocket(Vec<u8>);
|
pub struct DataForWebSocket(Vec<u8>);
|
||||||
|
|
||||||
|
#[derive(Message)]
|
||||||
|
#[rtype(result = "()")]
|
||||||
|
pub struct TCPReadEndClosed;
|
||||||
|
|
||||||
/// Define HTTP actor
|
/// Define HTTP actor
|
||||||
struct RelayWS {
|
struct RelayWS {
|
||||||
@ -72,6 +76,7 @@ impl Actor for RelayWS {
|
|||||||
Ok(l) => {
|
Ok(l) => {
|
||||||
if l == 0 {
|
if l == 0 {
|
||||||
log::info!("Got empty read. Closing read end...");
|
log::info!("Got empty read. Closing read end...");
|
||||||
|
addr.do_send(TCPReadEndClosed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,6 +134,16 @@ impl Handler<DataForWebSocket> for RelayWS {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Handler<TCPReadEndClosed> for RelayWS {
|
||||||
|
type Result = ();
|
||||||
|
|
||||||
|
fn handle(&mut self, _msg: TCPReadEndClosed, ctx: &mut Self::Context) -> Self::Result {
|
||||||
|
ctx.close(Some(CloseReason {
|
||||||
|
code: CloseCode::Away,
|
||||||
|
description: Some("TCP read end closed.".to_string()),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(serde::Deserialize)]
|
#[derive(serde::Deserialize)]
|
||||||
pub struct WebSocketQuery {
|
pub struct WebSocketQuery {
|
||||||
|
Loading…
Reference in New Issue
Block a user