Skip to content

Commit d31ee4c

Browse files
committed
feat!: Split into two crates.
Technically breaking change due to .parse no longer working due to missing type annotations. For example on socketio/src/client/socket.rs:154
1 parent 0187f29 commit d31ee4c

26 files changed

+548
-189
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/target
1+
target
22
Cargo.lock
33
.vscode
44
.idea

Cargo.toml

+2-30
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,2 @@
1-
[package]
2-
name = "rust_socketio"
3-
version = "0.2.4"
4-
authors = ["Bastian Kersting <[email protected]>"]
5-
edition = "2018"
6-
description = "An implementation of a socketio client written in rust."
7-
readme = "README.md"
8-
repository = "https://github.com/1c3t3a/rust-socketio"
9-
keywords = ["socketio", "engineio", "network", "protocol", "client"]
10-
categories = ["network-programming", "web-programming", "web-programming::websocket"]
11-
license = "MIT"
12-
13-
[dependencies]
14-
base64 = "0.13.0"
15-
bytes = "1"
16-
rand = "0.8.1"
17-
crossbeam-utils = "0.8.1"
18-
reqwest = { version = "0.11.0", features = ["blocking", "native-tls"] }
19-
adler32 = "1.2.0"
20-
serde = { version = "1.0", features = ["derive"] }
21-
serde_json = "1.0"
22-
regex = "1.4.2"
23-
byte = "0.2.4"
24-
websocket = "0.26.2"
25-
thiserror = "1.0"
26-
native-tls = "0.2.7"
27-
url = "2.2.2"
28-
29-
[dev-dependencies]
30-
cargo-tarpaulin = "0.18.0-alpha3"
1+
[workspace]
2+
members = ["engineio", "socketio"]

engineio/Cargo.toml

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[package]
2+
name = "rust_engineio"
3+
version = "0.2.4"
4+
authors = ["Bastian Kersting <[email protected]>"]
5+
edition = "2018"
6+
description = "An implementation of a engineio client written in rust."
7+
readme = "README.md"
8+
repository = "https://github.com/1c3t3a/rust-socketio"
9+
keywords = ["engineio", "network", "protocol", "client"]
10+
categories = ["network-programming", "web-programming", "web-programming::websocket"]
11+
license = "MIT"
12+
13+
[dependencies]
14+
base64 = "0.13.0"
15+
bytes = "1"
16+
rand = "0.8.1"
17+
crossbeam-utils = "0.8.1"
18+
reqwest = { version = "0.11.0", features = ["blocking", "native-tls"] }
19+
adler32 = "1.2.0"
20+
serde = { version = "1.0", features = ["derive"] }
21+
serde_json = "1.0"
22+
regex = "1.4.2"
23+
byte = "0.2.4"
24+
websocket = "0.26.2"
25+
thiserror = "1.0"
26+
native-tls = "0.2.7"
27+
url = "2.2.2"
28+
29+
[dev-dependencies]
30+
cargo-tarpaulin = "0.18.0-alpha3"
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
mod socket;
2-
pub(crate) use socket::Iter;
2+
pub use socket::Iter;
33
pub use {socket::Iter as SocketIter, socket::Socket, socket::SocketBuilder};

src/engineio/client/socket.rs engineio/src/client/socket.rs

+33-38
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
use super::super::socket::Socket as InnerSocket;
2-
use crate::engineio::transport::Transport;
2+
use crate::transport::Transport;
33

4-
use super::super::transports::{PollingTransport, WebsocketSecureTransport, WebsocketTransport};
5-
use crate::engineio::packet::{HandshakePacket, Packet, PacketId, Payload};
64
use crate::error::{Error, Result};
5+
use crate::header::HeaderMap;
6+
use crate::packet::{HandshakePacket, Packet, PacketId, Payload};
7+
use crate::transports::{PollingTransport, WebsocketSecureTransport, WebsocketTransport};
78
use bytes::Bytes;
89
use native_tls::TlsConnector;
9-
use reqwest::header::HeaderMap;
1010
use std::convert::TryFrom;
1111
use std::convert::TryInto;
1212
use std::fmt::Debug;
1313
use url::Url;
14-
use websocket::header::Headers;
1514

1615
#[derive(Clone, Debug)]
1716
pub struct Socket {
@@ -61,8 +60,11 @@ impl SocketBuilder {
6160
}
6261

6362
// Start with polling transport
64-
let transport =
65-
PollingTransport::new(url.clone(), self.tls_config.clone(), self.headers.clone());
63+
let transport = PollingTransport::new(
64+
url.clone(),
65+
self.tls_config.clone(),
66+
self.headers.clone().map(|v| v.try_into().unwrap()),
67+
);
6668

6769
let handshake: HandshakePacket = Packet::try_from(transport.poll()?)?.try_into()?;
6870

@@ -94,7 +96,11 @@ impl SocketBuilder {
9496
self.handshake()?;
9597

9698
// Make a polling transport with new sid
97-
let transport = PollingTransport::new(self.url, self.tls_config, self.headers);
99+
let transport = PollingTransport::new(
100+
self.url,
101+
self.tls_config,
102+
self.headers.map(|v| v.try_into().unwrap()),
103+
);
98104

99105
// SAFETY: handshake function called previously.
100106
Ok(Socket {
@@ -111,7 +117,10 @@ impl SocketBuilder {
111117

112118
if self.websocket_upgrade()? {
113119
if url.scheme() == "http" {
114-
let transport = WebsocketTransport::new(url, self.get_ws_headers()?);
120+
let transport = WebsocketTransport::new(
121+
url,
122+
self.headers.map(|headers| headers.try_into().unwrap()),
123+
);
115124
transport.upgrade()?;
116125
// SAFETY: handshake function called previously.
117126
Ok(Socket {
@@ -137,7 +146,7 @@ impl SocketBuilder {
137146
let transport = WebsocketSecureTransport::new(
138147
url,
139148
self.tls_config.clone(),
140-
self.get_ws_headers()?,
149+
self.headers.map(|v| v.try_into().unwrap()),
141150
);
142151
transport.upgrade()?;
143152
// SAFETY: handshake function called previously.
@@ -176,20 +185,6 @@ impl SocketBuilder {
176185
.iter()
177186
.any(|upgrade| upgrade.to_lowercase() == *"websocket"))
178187
}
179-
180-
/// Converts Reqwest headers to Websocket headers
181-
fn get_ws_headers(&self) -> Result<Option<Headers>> {
182-
let mut headers = Headers::new();
183-
if self.headers.is_some() {
184-
let opening_headers = self.headers.clone();
185-
for (key, val) in opening_headers.unwrap() {
186-
headers.append_raw(key.unwrap().to_string(), val.as_bytes().to_owned());
187-
}
188-
Ok(Some(headers))
189-
} else {
190-
Ok(None)
191-
}
192-
}
193188
}
194189

195190
impl Socket {
@@ -298,8 +293,8 @@ impl Socket {
298293
Ok(Some(payload))
299294
}
300295

301-
// Check if the underlying transport client is connected.
302-
pub(crate) fn is_connected(&self) -> Result<bool> {
296+
/// Check if the underlying transport client is connected.
297+
pub fn is_connected(&self) -> Result<bool> {
303298
self.socket.is_connected()
304299
}
305300

@@ -314,7 +309,7 @@ impl Socket {
314309
#[derive(Clone)]
315310
pub struct Iter<'a> {
316311
socket: &'a Socket,
317-
iter: Option<crate::engineio::packet::IntoIter>,
312+
iter: Option<crate::packet::IntoIter>,
318313
}
319314

320315
impl<'a> Iterator for Iter<'a> {
@@ -343,13 +338,13 @@ impl<'a> Iterator for Iter<'a> {
343338
#[cfg(test)]
344339
mod test {
345340

346-
use crate::engineio::packet::PacketId;
341+
use crate::packet::PacketId;
347342

348343
use super::*;
349344

350345
#[test]
351346
fn test_illegal_actions() -> Result<()> {
352-
let url = crate::engineio::test::engine_io_server()?;
347+
let url = crate::test::engine_io_server()?;
353348
let mut sut = SocketBuilder::new(url.clone()).build()?;
354349

355350
assert!(sut
@@ -379,7 +374,7 @@ mod test {
379374
}
380375
use reqwest::header::HOST;
381376

382-
use crate::engineio::packet::Packet;
377+
use crate::packet::Packet;
383378

384379
fn test_connection(socket: Socket) -> Result<()> {
385380
let mut socket = socket;
@@ -428,14 +423,14 @@ mod test {
428423

429424
#[test]
430425
fn test_connection_dynamic() -> Result<()> {
431-
let url = crate::engineio::test::engine_io_server()?;
426+
let url = crate::test::engine_io_server()?;
432427
let socket = SocketBuilder::new(url).build()?;
433428
test_connection(socket)
434429
}
435430

436431
#[test]
437432
fn test_connection_dynamic_secure() -> Result<()> {
438-
let url = crate::engineio::test::engine_io_server_secure()?;
433+
let url = crate::test::engine_io_server_secure()?;
439434
let mut builder = SocketBuilder::new(url);
440435
builder = builder.tls_config(crate::test::tls_connector()?);
441436
let socket = builder.build()?;
@@ -444,7 +439,7 @@ mod test {
444439

445440
#[test]
446441
fn test_connection_polling() -> Result<()> {
447-
let url = crate::engineio::test::engine_io_server()?;
442+
let url = crate::test::engine_io_server()?;
448443
let socket = SocketBuilder::new(url).build_polling()?;
449444
test_connection(socket)
450445
}
@@ -453,10 +448,10 @@ mod test {
453448
fn test_connection_wss() -> Result<()> {
454449
let host =
455450
std::env::var("ENGINE_IO_SECURE_HOST").unwrap_or_else(|_| "localhost".to_owned());
456-
let url = crate::engineio::test::engine_io_server_secure()?;
451+
let url = crate::test::engine_io_server_secure()?;
457452

458453
let mut headers = HeaderMap::new();
459-
headers.insert(HOST, host.parse().unwrap());
454+
headers.insert(HOST, host);
460455
let mut builder = SocketBuilder::new(url);
461456

462457
builder = builder.tls_config(crate::test::tls_connector()?);
@@ -468,7 +463,7 @@ mod test {
468463

469464
#[test]
470465
fn test_connection_ws() -> Result<()> {
471-
let url = crate::engineio::test::engine_io_server()?;
466+
let url = crate::test::engine_io_server()?;
472467

473468
let builder = SocketBuilder::new(url);
474469
let socket = builder.build_websocket()?;
@@ -478,7 +473,7 @@ mod test {
478473

479474
#[test]
480475
fn test_open_invariants() -> Result<()> {
481-
let url = crate::engineio::test::engine_io_server()?;
476+
let url = crate::test::engine_io_server()?;
482477
let illegal_url = "this is illegal";
483478

484479
assert!(Url::parse(&illegal_url).is_err());
@@ -498,7 +493,7 @@ mod test {
498493
let mut headers = HeaderMap::new();
499494
let host =
500495
std::env::var("ENGINE_IO_SECURE_HOST").unwrap_or_else(|_| "localhost".to_owned());
501-
headers.insert(HOST, host.parse().unwrap());
496+
headers.insert(HOST, host);
502497

503498
let _ = SocketBuilder::new(url.clone())
504499
.tls_config(

src/error.rs engineio/src/error.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use base64::DecodeError;
22
use reqwest::Error as ReqwestError;
33
use serde_json::Error as JsonError;
44
use std::io::Error as IoError;
5-
use std::num::ParseIntError;
65
use std::str::Utf8Error;
76
use thiserror::Error;
87
use url::ParseError as UrlParseError;
@@ -41,8 +40,6 @@ pub enum Error {
4140
IllegalActionBeforeOpen(),
4241
#[error("string is not json serializable: {0}")]
4342
InvalidJson(#[from] JsonError),
44-
#[error("Did not receive an ack for id: {0}")]
45-
MissingAck(i32),
4643
#[error("An illegal action (such as setting a callback after being connected) was triggered")]
4744
//TODO: make these impossible by using builders and immutable data.
4845
IllegalActionAfterOpen(),
@@ -56,12 +53,14 @@ pub enum Error {
5653
IncompleteIo(#[from] IoError),
5754
#[error("The socket is closed")]
5855
IllegalActionAfterClose(),
59-
#[error("Error while parsing an integer")]
60-
InvalidInteger(#[from] ParseIntError),
6156
#[error("Missing URL")]
6257
MissingUrl(),
6358
#[error("Server did not allow upgrading to websockets")]
6459
IllegalWebsocketUpgrade(),
60+
#[error("Invalid header name")]
61+
InvalidHeaderNameFromReqwest(#[from] reqwest::header::InvalidHeaderName),
62+
#[error("Invalid header value")]
63+
InvalidHeaderValueFromReqwest(#[from] reqwest::header::InvalidHeaderValue),
6564
}
6665

6766
pub(crate) type Result<T> = std::result::Result<T, Error>;

0 commit comments

Comments
 (0)