Skip to content

Commit

Permalink
Take advantage of weak features in Rust 1.60 for TLS enablement
Browse files Browse the repository at this point in the history
Previously it was impossible to have a unified feature named `rustls` or
`native-tls` that would turn on the respective TLS backend in the chosen
transport (`reqwest` or `ureq`) as a feature of `<crate>/tls` would
implicitly turn on `<crate>`.  Since Rust 1.60 it is now possible to
specify this crate-feature enablement through the use of the question
mark in `<crate>?/tls`, which will only enable the `tls` feature if
`<crate>` was enabled through other means (another feature).

Secondly we can now also let optional crates have the same name as a
feature, and use `dep:<crate>` to refer to the crate instead of the
dependency, making for a more pleasant experience without renames to
underscore suffixes (that subsequently have to be dealt with in Rust
code, e.g. with `use log_ as log;` renames).
  • Loading branch information
MarijnS95 committed Oct 21, 2022
1 parent 89b31f8 commit 10b737e
Show file tree
Hide file tree
Showing 19 changed files with 41 additions and 53 deletions.
2 changes: 1 addition & 1 deletion sentry-contexts/src/utils.rs
Expand Up @@ -197,10 +197,10 @@ pub fn device_context() -> Context {

#[cfg(test)]
mod tests {
use super::*;
#[cfg(windows)]
#[test]
fn windows_os_version_not_empty() {
use super::*;
let context = os_context();
match context {
Some(Context::Os(os_context)) => {
Expand Down
4 changes: 2 additions & 2 deletions sentry-core/Cargo.toml
Expand Up @@ -24,13 +24,13 @@ default = []
client = ["rand"]
# I would love to just have a `log` feature, but this is used inside a macro,
# and macros actually expand features (and extern crate) where they are used!
debug-logs = ["log_"]
debug-logs = ["dep:log"]
test = ["client"]
profiling = ["pprof", "build_id", "uuid", "sys-info", "findshlibs", "rustc_version_runtime", "libc", "indexmap"]
frame-pointer = ["pprof?/frame-pointer"]

[dependencies]
log_ = { package = "log", version = "0.4.8", optional = true, features = ["std"] }
log = { package = "log", version = "0.4.8", optional = true, features = ["std"] }
once_cell = "1"
rand = { version = "0.8.1", optional = true }
sentry-types = { version = "0.27.0", path = "../sentry-types" }
Expand Down
2 changes: 1 addition & 1 deletion sentry-core/src/macros.rs
Expand Up @@ -56,7 +56,7 @@ macro_rules! with_client_impl {
macro_rules! sentry_debug {
($($arg:tt)*) => {
#[cfg(feature = "debug-logs")] {
::log_::debug!(target: "sentry", $($arg)*);
::log::debug!(target: "sentry", $($arg)*);
}
#[cfg(not(feature = "debug-logs"))] {
$crate::Hub::with(|hub| {
Expand Down
4 changes: 2 additions & 2 deletions sentry-tower/Cargo.toml
Expand Up @@ -13,12 +13,12 @@ edition = "2021"
rust-version = "1.60"

[features]
http = ["http_", "pin-project", "url"]
http = ["dep:http", "pin-project", "url"]

[dependencies]
tower-layer = "0.3"
tower-service = "0.3"
http_ = { package = "http", version = "0.2.6", optional = true }
http = { package = "http", version = "0.2.6", optional = true }
pin-project = { version = "1.0.10", optional = true }
sentry-core = { version = "0.27.0", path = "../sentry-core", default-features = false, features = ["client"] }
url = { version = "2.2.2", optional = true }
Expand Down
2 changes: 1 addition & 1 deletion sentry-tower/src/http.rs
Expand Up @@ -3,7 +3,7 @@ use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};

use http_::{header, uri, Request, Response, StatusCode};
use http::{header, uri, Request, Response, StatusCode};
use sentry_core::protocol;
use tower_layer::Layer;
use tower_service::Service;
Expand Down
4 changes: 2 additions & 2 deletions sentry-tower/src/lib.rs
Expand Up @@ -121,7 +121,7 @@
//!
//! ```rust
//! # #[cfg(feature = "http")] {
//! # type Request = http_::Request<String>;
//! # type Request = http::Request<String>;
//! let layer = tower::ServiceBuilder::new()
//! .layer(sentry_tower::NewSentryLayer::<Request>::new_from_top())
//! .layer(sentry_tower::SentryHttpLayer::with_transaction());
Expand All @@ -145,7 +145,7 @@ use tower_service::Service;
#[cfg(feature = "http")]
mod http;
#[cfg(feature = "http")]
pub use http::*;
pub use crate::http::*;

/// Provides a hub for each request
pub trait HubProvider<H, Request>
Expand Down
40 changes: 20 additions & 20 deletions sentry/Cargo.toml
Expand Up @@ -39,17 +39,17 @@ profiling = ["sentry-core/profiling"]
frame-pointer = ["sentry-core/frame-pointer"]
# other features
test = ["sentry-core/test"]
debug-logs = ["log_", "sentry-core/debug-logs"]
debug-logs = ["dep:log", "sentry-core/debug-logs"]
# transports
transport = ["reqwest", "native-tls"]
reqwest = ["reqwest_", "httpdate", "tokio"]
curl = ["curl_", "httpdate"]
surf-h1 = ["surf_/h1-client", "httpdate"]
surf = ["surf_/curl-client", "http-client", "httpdate", "isahc", "tokio"]
native-tls = ["reqwest_/default-tls", "native-tls_", "ureq-native-tls"]
rustls = ["reqwest_/rustls-tls", "rustls_", "webpki-roots"]
ureq = ["ureq_/tls", "httpdate", "rustls_", "webpki-roots"]
ureq-native-tls = ["ureq_/native-tls", "httpdate", "native-tls_"]
reqwest = ["dep:reqwest", "httpdate", "tokio"]
curl = ["dep:curl", "httpdate"]
surf-h1 = ["surf/h1-client", "httpdate"]
surf = ["surf/curl-client", "http-client", "httpdate", "isahc", "tokio"]
ureq = ["dep:ureq", "httpdate"]
# transport settings
native-tls = ["dep:native-tls", "reqwest?/default-tls", "ureq?/native-tls"]
rustls = ["dep:rustls", "reqwest?/rustls-tls", "ureq?/tls", "webpki-roots"]

[dependencies]
sentry-core = { version = "0.27.0", path = "../sentry-core", features = ["client"] }
Expand All @@ -62,18 +62,18 @@ sentry-panic = { version = "0.27.0", path = "../sentry-panic", optional = true }
sentry-slog = { version = "0.27.0", path = "../sentry-slog", optional = true }
sentry-tower = { version = "0.27.0", path = "../sentry-tower", optional = true }
sentry-tracing = { version = "0.27.0", path = "../sentry-tracing", optional = true }
log_ = { package = "log", version = "0.4.8", optional = true, features = ["std"] }
reqwest_ = { package = "reqwest", version = "0.11", optional = true, features = ["blocking", "json"], default-features = false }
curl_ = { package = "curl", version = "0.4.25", optional = true }
log = { version = "0.4.8", optional = true, features = ["std"] }
reqwest = { version = "0.11", optional = true, features = ["blocking", "json"], default-features = false }
curl = { version = "0.4.25", optional = true }
httpdate = { version = "1.0.0", optional = true }
surf_ = { package = "surf", version = "2.0.0", optional = true, default-features = false }
surf = { package = "surf", version = "2.0.0", optional = true, default-features = false }
http-client = { version = "6.5.3", optional = true }
isahc = { version = "0.9.14", optional = true }
serde_json = { version = "1.0.48", optional = true }
tokio = { version = "1.0", features = ["rt"], optional = true }
ureq_ = { package = "ureq", version = "2.3.0", optional = true, default-features = false }
native-tls_ = { package = "native-tls", version = "0.2.8", optional = true }
rustls_ = { package = "rustls", version = "0.20.6", optional = true, features = ["dangerous_configuration"] }
ureq = { package = "ureq", version = "2.3.0", optional = true, default-features = false }
native-tls = { package = "native-tls", version = "0.2.8", optional = true }
rustls = { package = "rustls", version = "0.20.6", optional = true, features = ["dangerous_configuration"] }
webpki-roots = { version = "0.22.5", optional = true }

[dev-dependencies]
Expand All @@ -84,10 +84,10 @@ sentry-tower = { path = "../sentry-tower" }
sentry-tracing = { path = "../sentry-tracing" }
actix-web = { version = "4", default-features = false }
anyhow_ = { package = "anyhow", version = "1.0.30" }
log_ = { package = "log", version = "0.4.8", features = ["std"] }
log = { version = "0.4.8", features = ["std"] }
pretty_env_logger = "0.4.0"
slog_ = { package = "slog", version = "2.5.2" }
slog = {version = "2.5.2" }
tokio = { version = "1.0", features = ["macros"] }
tower_ = { package = "tower", version = "0.4", features = ["util"] }
tracing_ = { package = "tracing", version = "0.1" }
tower = { version = "0.4", features = ["util"] }
tracing = { package = "tracing", version = "0.1" }
tracing-subscriber = { version = "0.3", features = ["fmt", "tracing-log"] }
1 change: 0 additions & 1 deletion sentry/examples/log-demo.rs
@@ -1,5 +1,4 @@
use log::{debug, error, info, warn};
use log_ as log;

fn main() {
init_log();
Expand Down
1 change: 0 additions & 1 deletion sentry/examples/thread-demo.rs
@@ -1,4 +1,3 @@
use log_ as log;
use std::sync::Arc;
use std::thread;

Expand Down
1 change: 0 additions & 1 deletion sentry/examples/tracing-demo.rs
@@ -1,7 +1,6 @@
use std::thread;
use std::time::Duration;

use tracing_ as tracing;
use tracing_subscriber::prelude::*;

// cargo run --example tracing-demo
Expand Down
2 changes: 1 addition & 1 deletion sentry/src/transports/curl.rs
@@ -1,7 +1,7 @@
use std::io::{Cursor, Read};
use std::time::Duration;

use curl_::{self as curl, easy::Easy as CurlClient};
use curl::easy::Easy as CurlClient;

use super::thread::TransportThread;

Expand Down
8 changes: 4 additions & 4 deletions sentry/src/transports/mod.rs
Expand Up @@ -16,22 +16,22 @@ mod tokio_thread;
#[cfg(feature = "reqwest")]
mod reqwest;
#[cfg(feature = "reqwest")]
pub use reqwest::ReqwestHttpTransport;
pub use self::reqwest::ReqwestHttpTransport;

#[cfg(feature = "curl")]
mod curl;
#[cfg(feature = "curl")]
pub use curl::CurlHttpTransport;
pub use self::curl::CurlHttpTransport;

#[cfg(feature = "surf")]
mod surf;
#[cfg(feature = "surf")]
pub use surf::SurfHttpTransport;
pub use self::surf::SurfHttpTransport;

#[cfg(feature = "ureq")]
mod ureq;
#[cfg(feature = "ureq")]
pub use ureq::UreqHttpTransport;
pub use self::ureq::UreqHttpTransport;

#[cfg(feature = "reqwest")]
type DefaultTransport = ReqwestHttpTransport;
Expand Down
4 changes: 2 additions & 2 deletions sentry/src/transports/reqwest.rs
@@ -1,6 +1,6 @@
use std::time::Duration;

use reqwest_::{header as ReqwestHeaders, Client as ReqwestClient, Proxy, StatusCode};
use reqwest::{header as ReqwestHeaders, Client as ReqwestClient, Proxy, StatusCode};

use super::tokio_thread::TransportThread;

Expand Down Expand Up @@ -31,7 +31,7 @@ impl ReqwestHttpTransport {

fn new_internal(options: &ClientOptions, client: Option<ReqwestClient>) -> Self {
let client = client.unwrap_or_else(|| {
let mut builder = reqwest_::Client::builder();
let mut builder = reqwest::Client::builder();
if options.accept_invalid_certs {
builder = builder.danger_accept_invalid_certs(true);
}
Expand Down
2 changes: 1 addition & 1 deletion sentry/src/transports/surf.rs
Expand Up @@ -4,7 +4,7 @@ use isahc::{
config::{Configurable, SslOption},
HttpClient,
};
use surf_::{http::headers as SurfHeaders, Client as SurfClient, StatusCode};
use surf::{http::headers as SurfHeaders, Client as SurfClient, StatusCode};

use super::tokio_thread::TransportThread;

Expand Down
8 changes: 3 additions & 5 deletions sentry/src/transports/ureq.rs
Expand Up @@ -4,15 +4,13 @@ use std::time::Duration;
use std::time::SystemTime;

#[cfg(feature = "native-tls")]
use native_tls_::TlsConnector;
use native_tls::TlsConnector;
#[cfg(feature = "rustls")]
use rustls_::{
use rustls::{
client::{ServerCertVerified, ServerCertVerifier},
Certificate, ClientConfig, Error, OwnedTrustAnchor, RootCertStore, ServerName,
};
#[cfg(doc)]
use ureq_ as ureq;
use ureq_::{Agent, AgentBuilder, Proxy};
use ureq::{Agent, AgentBuilder, Proxy};
#[cfg(feature = "rustls")]
use webpki_roots::TLS_SERVER_ROOTS;

Expand Down
2 changes: 0 additions & 2 deletions sentry/tests/test_basic.rs
Expand Up @@ -143,8 +143,6 @@ fn test_reentrant_configure_scope() {

#[test]
fn test_attached_stacktrace() {
use log_ as log;

let logger = sentry_log::SentryLogger::new();

log::set_boxed_logger(Box::new(logger))
Expand Down
3 changes: 0 additions & 3 deletions sentry/tests/test_log.rs
@@ -1,8 +1,5 @@
#![cfg(feature = "test")]

use log_ as log;
use slog_ as slog;

#[test]
fn test_log() {
let logger = sentry_log::SentryLogger::new();
Expand Down
2 changes: 1 addition & 1 deletion sentry/tests/test_tower.rs
Expand Up @@ -8,7 +8,7 @@ use sentry::{
ClientOptions, Hub,
};
use sentry_tower::SentryLayer;
use tower_::{ServiceBuilder, ServiceExt};
use tower::{ServiceBuilder, ServiceExt};

#[test]
fn test_tower_hub() {
Expand Down
2 changes: 0 additions & 2 deletions sentry/tests/test_tracing.rs
@@ -1,8 +1,6 @@
#![cfg(feature = "test")]

use log_ as log;
use sentry::protocol::{Context, Request, Value};
use tracing_ as tracing;
use tracing_subscriber::prelude::*;

#[test]
Expand Down

0 comments on commit 10b737e

Please sign in to comment.