Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ client = []
all-features = true

[dependencies]
headers = "0.3.7"
http = "0.2.8"
httparse = "1.7.1"
rustls = { version = "0.20.6", optional = true, default-features = false }
headers = "0.4"
http = "1"
httparse = "1.9"
rustls = { version = "0.23", optional = true, default-features = false, features = ["std"] }
thiserror = "1.0.31"
threadpool = { version = "1.8.1", optional = true, default-features = false }

Expand All @@ -33,9 +33,10 @@ flate2 = "1.0.24"
futures = "0.3.28"
indoc = "1.0.6"
md5 = "0.7.0"
rustls-pemfile = "1.0.0"
rustls = { version = "0.23", default-features = false, features = ["std", "ring"] }
rustls-pki-types= "1.10"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1.29.1", features = ["full"] }
tokio-tungstenite = "0.19.0"
tungstenite = "0.17.3"
tokio = { version = "1.43", features = ["full"] }
tokio-tungstenite = "0.26"
tungstenite = "0.26"
34 changes: 12 additions & 22 deletions examples/rustls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,18 @@ fn main() -> std::io::Result<()> {
sync::Arc,
};

use rustls::{ServerConfig, ServerConnection, StreamOwned};
use rustls::{crypto, ServerConfig, ServerConnection, StreamOwned};
use touche::{Response, Server, StatusCode};

crypto::ring::default_provider().install_default().ok();

let listener = TcpListener::bind("0.0.0.0:4444")?;

let tls_cfg = {
let certs = certs::load_certs("examples/tls/cert.pem")?;
let key = certs::load_private_key("examples/tls/key.pem")?;

let cfg = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_single_cert(certs, key)
.map_err(|e| io::Error::new(Other, e))?;
Expand Down Expand Up @@ -52,29 +53,18 @@ fn main() -> std::io::Result<()> {

#[cfg(feature = "rustls")]
mod certs {
use std::{
fs,
io::{self, ErrorKind::Other},
};
use std::io::{self, ErrorKind::Other};

use rustls::{Certificate, PrivateKey};
use rustls_pemfile as pem;
use rustls_pki_types::{pem::PemObject, CertificateDer, PrivateKeyDer};

pub fn load_certs(filename: &str) -> io::Result<Vec<Certificate>> {
let certfile = fs::File::open(filename)?;
let mut reader = io::BufReader::new(certfile);

let certs = pem::certs(&mut reader).map_err(|err| io::Error::new(Other, err))?;

Ok(certs.into_iter().map(Certificate).collect())
pub fn load_certs(filename: &str) -> io::Result<Vec<CertificateDer<'static>>> {
CertificateDer::pem_file_iter(filename)
.map_err(|err| io::Error::new(Other, err))?
.map(|cert| cert.map_err(|err| io::Error::new(Other, err)))
.collect()
}

pub fn load_private_key(filename: &str) -> io::Result<PrivateKey> {
let keyfile = fs::File::open(filename)?;
let mut reader = io::BufReader::new(keyfile);

let keys = pem::rsa_private_keys(&mut reader).map_err(|err| io::Error::new(Other, err))?;

Ok(PrivateKey(keys[0].clone()))
pub fn load_private_key(filename: &str) -> io::Result<PrivateKeyDer<'static>> {
PrivateKeyDer::from_pem_file(filename).map_err(|err| io::Error::new(Other, err))
}
}
7 changes: 4 additions & 3 deletions examples/websocket-chat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,16 @@ fn main() -> std::io::Result<()> {

let write_ws = thread::spawn(move || {
for evt in rx {
let msg = tungstenite::Message::Text(serde_json::to_string(&evt).unwrap());
if write_ws.write_message(msg).is_err() {
let msg =
tungstenite::Message::Text(serde_json::to_string(&evt).unwrap().into());
if write_ws.send(msg).is_err() {
break;
}
}
});

let read_ws = thread::spawn(move || {
while let Ok(msg) = read_ws.read_message() {
while let Ok(msg) = read_ws.read() {
match msg.to_text() {
Ok(text) => {
let text = text.to_owned();
Expand Down
4 changes: 2 additions & 2 deletions examples/websocket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ fn main() -> std::io::Result<()> {
Ok::<_, Box<dyn Error + Send + Sync>>(res.upgrade(|stream: Connection| {
let mut ws = WebSocket::from_raw_socket(stream, Role::Server, None);

while let Ok(msg) = ws.read_message() {
if msg.is_text() && ws.write_message(msg).is_err() {
while let Ok(msg) = ws.read() {
if msg.is_text() && ws.send(msg).is_err() {
break;
}
}
Expand Down
9 changes: 6 additions & 3 deletions src/upgrade.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::sync::Arc;

use thiserror::Error;

use crate::connection::Connection;
Expand All @@ -12,8 +14,9 @@ impl<F: Fn(Connection) + Sync + Send> UpgradeHandler for F {
}
}

#[derive(Clone)]
pub(crate) struct UpgradeExtension {
pub(crate) handler: Box<dyn UpgradeHandler + 'static>,
pub(crate) handler: Arc<dyn UpgradeHandler + 'static>,
}

pub trait Upgrade {
Expand All @@ -23,15 +26,15 @@ pub trait Upgrade {
impl Upgrade for http::response::Builder {
fn upgrade(self, handle: impl UpgradeHandler + 'static) -> Self {
self.extension(UpgradeExtension {
handler: Box::new(handle),
handler: Arc::new(handle),
})
}
}

impl<T> Upgrade for http::Response<T> {
fn upgrade(mut self, handle: impl UpgradeHandler + 'static) -> Self {
self.extensions_mut().insert(UpgradeExtension {
handler: Box::new(handle),
handler: Arc::new(handle),
});
self
}
Expand Down
Loading