Skip to content

Commit aea41bd

Browse files
authored
feat: add support for wss (TLS) connections for clients (#62)
* Add tls support for websocket client transport * Update websocket client example for headers
1 parent 5679665 commit aea41bd

File tree

4 files changed

+30
-16
lines changed

4 files changed

+30
-16
lines changed

rsocket-transport-websocket/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ log = "0.4.14"
1414
futures = "0.3.15"
1515
bytes = "1.0.1"
1616
url = "2.2.2"
17-
tokio-tungstenite = "0.13.0"
17+
18+
[dependencies.tokio-tungstenite]
19+
version = "0.18.0"
20+
features = ["native-tls"]
1821

1922
[dependencies.rsocket_rust]
2023
path = "../rsocket"

rsocket-transport-websocket/src/client.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ use std::net::SocketAddr;
22

33
use rsocket_rust::{async_trait, error::RSocketError, transport::Transport, Result};
44
use tokio::net::TcpStream;
5-
use tokio_tungstenite::{accept_async, connect_async, tungstenite::handshake::client::Request};
5+
use tokio_tungstenite::{accept_async, connect_async, tungstenite::handshake::client::Request, MaybeTlsStream};
66
use url::Url;
77

88
use super::connection::WebsocketConnection;
99

1010
pub type WebsocketRequest = Request;
1111

12+
const WS_PROTO: &str = "ws://";
13+
const WSS_PROTO: &str = "wss://";
14+
1215
#[derive(Debug)]
1316
pub(crate) enum Connector {
14-
Direct(TcpStream),
17+
Direct(MaybeTlsStream<TcpStream>),
1518
Url(Url),
1619
Request(WebsocketRequest),
1720
}
@@ -49,26 +52,32 @@ impl Transport for WebsocketClientTransport {
4952
}
5053
}
5154

55+
impl From<MaybeTlsStream<TcpStream>> for WebsocketClientTransport {
56+
fn from(socket: MaybeTlsStream<TcpStream>) -> WebsocketClientTransport {
57+
WebsocketClientTransport::new(Connector::Direct(socket))
58+
}
59+
}
60+
5261
impl From<TcpStream> for WebsocketClientTransport {
5362
fn from(socket: TcpStream) -> WebsocketClientTransport {
54-
WebsocketClientTransport::new(Connector::Direct(socket))
63+
WebsocketClientTransport::new(Connector::Direct(MaybeTlsStream::Plain(socket)))
5564
}
5665
}
5766

5867
impl From<&str> for WebsocketClientTransport {
5968
fn from(addr: &str) -> WebsocketClientTransport {
60-
let u = if addr.starts_with("ws://") {
69+
let u = if addr.starts_with(WS_PROTO) || addr.starts_with(WSS_PROTO) {
6170
Url::parse(addr).unwrap()
6271
} else {
63-
Url::parse(&format!("ws://{}", addr)).unwrap()
72+
Url::parse(&format!("{}{}", WS_PROTO, addr)).unwrap()
6473
};
6574
WebsocketClientTransport::new(Connector::Url(u))
6675
}
6776
}
6877

6978
impl From<SocketAddr> for WebsocketClientTransport {
7079
fn from(addr: SocketAddr) -> WebsocketClientTransport {
71-
let u = Url::parse(&format!("ws://{}", addr)).unwrap();
80+
let u = Url::parse(&format!("{}{}", WS_PROTO, addr)).unwrap();
7281
WebsocketClientTransport::new(Connector::Url(u))
7382
}
7483
}

rsocket-transport-websocket/src/connection.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,24 @@ use rsocket_rust::{
1010
utils::Writeable,
1111
};
1212
use tokio::net::TcpStream;
13+
use tokio_tungstenite::MaybeTlsStream;
1314
use tokio_tungstenite::{
1415
tungstenite::{Error as WsError, Message},
1516
WebSocketStream,
1617
};
1718

1819
#[derive(Debug)]
1920
pub struct WebsocketConnection {
20-
stream: WebSocketStream<TcpStream>,
21+
stream: WebSocketStream<MaybeTlsStream<TcpStream>>,
2122
}
2223

2324
impl WebsocketConnection {
24-
pub(crate) fn new(stream: WebSocketStream<TcpStream>) -> WebsocketConnection {
25+
pub(crate) fn new(stream: WebSocketStream<MaybeTlsStream<TcpStream>>) -> WebsocketConnection {
2526
WebsocketConnection { stream }
2627
}
2728
}
2829

29-
struct InnerSink(SplitSink<WebSocketStream<TcpStream>, Message>);
30+
struct InnerSink(SplitSink<WebSocketStream<MaybeTlsStream<TcpStream>>, Message>);
3031

3132
impl Sink<Frame> for InnerSink {
3233
type Error = WsError;

rsocket-transport-websocket/src/lib.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@ pub use server::WebsocketServerTransport;
1414
mod test_websocket {
1515
use super::*;
1616
use rsocket_rust::prelude::*;
17+
use tokio_tungstenite::tungstenite::client::IntoClientRequest;
1718

1819
#[ignore]
1920
#[tokio::test]
2021
async fn test_client() {
21-
let req: WebsocketRequest = WebsocketRequest::builder()
22-
.uri("ws://127.0.0.1:8080/hello")
23-
.header("x-foo-bar", "42")
24-
.method("GET")
25-
.body(())
26-
.unwrap();
22+
let mut req = "ws://127.0.0.1:8080/hello".into_client_request().unwrap();
23+
24+
// Optional: custom headers
25+
let headers = req.headers_mut();
26+
headers.insert("x-foo-bar", "42".parse().unwrap());
27+
2728
let tp = WebsocketClientTransport::from(req);
2829
let c = RSocketFactory::connect()
2930
.transport(tp)

0 commit comments

Comments
 (0)