Skip to content

Commit 497e1bd

Browse files
committed
sentry - TLS support with axum
- add graceful shutdown - Cargo - remove crate for hyper tls support - remove old Application::run
1 parent 05014cd commit 497e1bd

File tree

4 files changed

+40
-103
lines changed

4 files changed

+40
-103
lines changed

Cargo.lock

Lines changed: 0 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sentry/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ tower = "0.4"
4747
tower-http = { version = "0.3", features = ["cors"] }
4848
tokio = { version = "1", features = ["macros", "time", "rt-multi-thread", "signal"] }
4949
hyper = { version = "0.14", features = ["stream", "runtime", "http1", "http2", "server"] }
50-
simple-hyper-server-tls = { version = "0.3", features = ["tls-rustls"] }
5150
regex = "1"
5251
# Database
5352
redis = { version = "0.21", features = ["aio", "tokio-comp"] }

sentry/src/application.rs

Lines changed: 39 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@ use std::{
44
sync::Arc,
55
};
66

7-
use adapter::client::Locked;
87
use axum::{
98
extract::{FromRequest, RequestParts},
109
http::StatusCode,
1110
middleware,
1211
routing::get,
1312
Extension, Router,
1413
};
15-
use hyper::{
16-
service::{make_service_fn, service_fn},
17-
Error, Server,
18-
};
14+
use axum_server::{tls_rustls::RustlsConfig, Handle};
15+
use hyper::{Body, Method, Request, Response};
1916
use once_cell::sync::Lazy;
20-
use primitives::{config::Environment, ValidatorId};
21-
use redis::ConnectionInfo;
17+
use redis::{aio::MultiplexedConnection, ConnectionInfo};
2218
use serde::{Deserialize, Deserializer};
23-
use simple_hyper_server_tls::{listener_from_pem_files, Protocols, TlsListener};
24-
use slog::{error, info};
19+
use slog::{error, info, Logger};
2520
use tower::ServiceBuilder;
2621
use tower_http::cors::CorsLayer;
2722

23+
use adapter::{client::Locked, Adapter};
24+
use primitives::{config::Environment, ValidatorId};
25+
2826
use crate::{
2927
db::{CampaignRemaining, DbPool},
3028
middleware::{
@@ -42,10 +40,6 @@ use crate::{
4240
},
4341
},
4442
};
45-
use adapter::Adapter;
46-
use hyper::{Body, Method, Request, Response};
47-
use redis::aio::MultiplexedConnection;
48-
use slog::Logger;
4943

5044
/// an error used when deserializing a [`EnvConfig`] instance from environment variables
5145
/// see [`EnvConfig::from_env()`]
@@ -206,81 +200,50 @@ where
206200
}
207201

208202
impl<C: Locked + 'static> Application<C> {
209-
/// Starts the `hyper` `Server`.
210-
pub async fn run2(self, enable_tls: EnableTls) {
203+
pub async fn run(self, enable_tls: EnableTls) {
211204
let logger = self.logger.clone();
212205
let socket_addr = match &enable_tls {
213206
EnableTls::NoTls(socket_addr) => socket_addr,
214207
EnableTls::Tls { socket_addr, .. } => socket_addr,
215208
};
216209

217210
info!(&logger, "Listening on socket address: {}!", socket_addr);
211+
let router = self.axum_routing().await;
212+
213+
let handle = Handle::new();
214+
215+
// Spawn a task to shutdown server.
216+
tokio::spawn(shutdown_signal(logger.clone(), handle.clone()));
218217

219218
match enable_tls {
220219
EnableTls::NoTls(socket_addr) => {
221-
let make_service = make_service_fn(|_| {
222-
let server = self.clone();
223-
async move {
224-
Ok::<_, Error>(service_fn(move |req| {
225-
let server = server.clone();
226-
async move { Ok::<_, Error>(server.handle_routing(req).await) }
227-
}))
228-
}
229-
});
230-
231-
let server = Server::bind(&socket_addr)
232-
.serve(make_service)
233-
.with_graceful_shutdown(shutdown_signal(logger.clone()));
234-
235-
if let Err(e) = server.await {
236-
error!(&logger, "server error: {}", e; "main" => "run");
237-
}
238-
}
239-
EnableTls::Tls { listener, .. } => {
240-
let make_service = make_service_fn(|_| {
241-
let server = self.clone();
242-
async move {
243-
Ok::<_, Error>(service_fn(move |req| {
244-
let server = server.clone();
245-
async move { Ok::<_, Error>(server.handle_routing(req).await) }
246-
}))
247-
}
248-
});
249-
250-
// TODO: Find a way to redirect to HTTPS
251-
let server = Server::builder(listener)
252-
.serve(make_service)
253-
.with_graceful_shutdown(shutdown_signal(logger.clone()));
220+
let server = axum_server::bind(socket_addr)
221+
.handle(handle)
222+
.serve(router.into_make_service());
223+
254224
tokio::pin!(server);
255225

256226
while let Err(e) = (&mut server).await {
257227
// This is usually caused by trying to connect on HTTP instead of HTTPS
258228
error!(&logger, "server error: {}", e; "main" => "run");
259229
}
260230
}
261-
}
262-
}
263231

264-
pub async fn run(self, enable_tls: EnableTls) {
265-
let logger = self.logger.clone();
266-
let socket_addr = match &enable_tls {
267-
EnableTls::NoTls(socket_addr) => socket_addr,
268-
EnableTls::Tls { socket_addr, .. } => socket_addr,
269-
};
270-
271-
info!(&logger, "Listening on socket address: {}!", socket_addr);
272-
273-
let app = self.axum_routing().await;
274-
275-
let server = axum::Server::bind(socket_addr)
276-
.serve(app.into_make_service())
277-
.with_graceful_shutdown(shutdown_signal(logger.clone()));
232+
EnableTls::Tls {
233+
config,
234+
socket_addr,
235+
} => {
236+
let server = axum_server::bind_rustls(socket_addr, config)
237+
.handle(handle)
238+
.serve(router.into_make_service());
278239

279-
tokio::pin!(server);
240+
tokio::pin!(server);
280241

281-
while let Err(e) = (&mut server).await {
282-
// This is usually caused by trying to connect on HTTP instead of HTTPS
283-
error!(&logger, "server error: {}", e; "main" => "run");
242+
while let Err(e) = (&mut server).await {
243+
// This is usually caused by trying to connect on HTTP instead of HTTPS
244+
error!(&logger, "server error: {}", e; "main" => "run");
245+
}
246+
}
284247
}
285248
}
286249
}
@@ -304,21 +267,20 @@ pub enum EnableTls {
304267
NoTls(SocketAddr),
305268
Tls {
306269
socket_addr: SocketAddr,
307-
listener: TlsListener,
270+
config: RustlsConfig,
308271
},
309272
}
310273

311274
impl EnableTls {
312-
pub fn new_tls<C: AsRef<Path>, K: AsRef<Path>>(
275+
pub async fn new_tls<C: AsRef<Path>, K: AsRef<Path>>(
313276
certificates: C,
314277
private_keys: K,
315278
socket_addr: SocketAddr,
316279
) -> Result<Self, Box<dyn std::error::Error>> {
317-
let listener =
318-
listener_from_pem_files(certificates, private_keys, Protocols::ALL, &socket_addr)?;
280+
let config = RustlsConfig::from_pem_file(certificates, private_keys).await?;
319281

320282
Ok(Self::Tls {
321-
listener,
283+
config,
322284
socket_addr,
323285
})
324286
}
@@ -368,12 +330,15 @@ where
368330
}
369331

370332
/// A Ctrl+C signal to gracefully shutdown the server
371-
async fn shutdown_signal(logger: Logger) {
333+
async fn shutdown_signal(logger: Logger, handle: Handle) {
372334
// Wait for the Ctrl+C signal
373335
tokio::signal::ctrl_c()
374336
.await
375337
.expect("failed to install CTRL+C signal handler");
376338

339+
// Signal the server to shutdown using Handle.
340+
handle.shutdown();
341+
377342
info!(&logger, "Received Ctrl+C signal. Shutting down..")
378343
}
379344

sentry/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
115115
) {
116116
(Some(certs_path), Some(private_keys)) => {
117117
EnableTls::new_tls(certs_path, private_keys, socket_addr)
118+
.await
118119
.expect("Failed to load certificates & private key files")
119120
}
120121
(None, None) => EnableTls::no_tls(socket_addr),

0 commit comments

Comments
 (0)