feat(websocket): Add custom headers feature

pull/543/head
DreamingCodes 2 years ago
parent 113add739f
commit baa39fb0d3
No known key found for this signature in database
GPG Key ID: 294D2672488EAE23

@ -6,6 +6,7 @@ export interface ConnectionConfig {
maxMessageSize?: number; maxMessageSize?: number;
maxFrameSize?: number; maxFrameSize?: number;
acceptUnmaskedFrames?: boolean; acceptUnmaskedFrames?: boolean;
headers?: Record<string, string>;
} }
export interface MessageKind<T, D> { export interface MessageKind<T, D> {

@ -29,6 +29,9 @@ use tokio_tungstenite::{
}; };
use std::collections::HashMap; use std::collections::HashMap;
use std::str::FromStr;
use tauri::http::header::{HeaderName, HeaderValue};
use tokio_tungstenite::tungstenite::client::IntoClientRequest;
type Id = u32; type Id = u32;
type WebSocket = WebSocketStream<MaybeTlsStream<TcpStream>>; type WebSocket = WebSocketStream<MaybeTlsStream<TcpStream>>;
@ -41,6 +44,10 @@ enum Error {
Websocket(#[from] tokio_tungstenite::tungstenite::Error), Websocket(#[from] tokio_tungstenite::tungstenite::Error),
#[error("connection not found for the given id: {0}")] #[error("connection not found for the given id: {0}")]
ConnectionNotFound(Id), ConnectionNotFound(Id),
#[error(transparent)]
InvalidHeaderValue(#[from] tokio_tungstenite::tungstenite::http::header::InvalidHeaderValue),
#[error(transparent)]
InvalidHeaderName(#[from] tokio_tungstenite::tungstenite::http::header::InvalidHeaderName),
} }
impl Serialize for Error { impl Serialize for Error {
@ -63,6 +70,8 @@ pub struct ConnectionConfig {
pub max_frame_size: Option<usize>, pub max_frame_size: Option<usize>,
#[serde(default)] #[serde(default)]
pub accept_unmasked_frames: bool, pub accept_unmasked_frames: bool,
#[serde(default)]
pub headers: HashMap<String, String>,
} }
impl From<ConnectionConfig> for WebSocketConfig { impl From<ConnectionConfig> for WebSocketConfig {
@ -100,7 +109,19 @@ async fn connect<R: Runtime>(
config: Option<ConnectionConfig>, config: Option<ConnectionConfig>,
) -> Result<Id> { ) -> Result<Id> {
let id = rand::random(); let id = rand::random();
let (ws_stream, _) = connect_async_with_config(url, config.map(Into::into), false).await?; let mut request = url.into_client_request()?;
if let Some(ref config) = config {
let config_headers = config.headers.iter().map(|(k, v)| {
let header_name = HeaderName::from_str(k.as_str())?;
let header_value = HeaderValue::from_str(v.as_str())?;
Ok((header_name, header_value))
});
request.headers_mut().extend(config_headers.filter_map(Result::ok));
}
let (ws_stream, _) = connect_async_with_config(request, config.map(Into::into), false).await?;
tauri::async_runtime::spawn(async move { tauri::async_runtime::spawn(async move {
let (write, read) = ws_stream.split(); let (write, read) = ws_stream.split();

Loading…
Cancel
Save