Skip to content

Commit b40c38e

Browse files
committed
feat(mysql): allow overriding TLS server name
1 parent e8384f2 commit b40c38e

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

sqlx-mysql/src/connection/tls.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ pub(super) async fn maybe_upgrade<S: Socket>(
5353
}
5454
}
5555

56+
let hostname = options.tls_server_name.as_deref().unwrap_or(&options.host);
5657
let tls_config = TlsConfig {
5758
accept_invalid_certs: !matches!(
5859
options.ssl_mode,
5960
MySqlSslMode::VerifyCa | MySqlSslMode::VerifyIdentity
6061
),
6162
accept_invalid_hostnames: !matches!(options.ssl_mode, MySqlSslMode::VerifyIdentity),
62-
hostname: &options.host,
63+
hostname,
6364
root_cert_path: options.ssl_ca.as_ref(),
6465
client_cert_path: options.ssl_client_cert.as_ref(),
6566
client_key_path: options.ssl_client_key.as_ref(),

sqlx-mysql/src/options/mod.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ pub struct MySqlConnectOptions {
6868
pub(crate) password: Option<String>,
6969
pub(crate) database: Option<String>,
7070
pub(crate) ssl_mode: MySqlSslMode,
71+
pub(crate) tls_server_name: Option<String>,
7172
pub(crate) ssl_ca: Option<CertificateInput>,
7273
pub(crate) ssl_client_cert: Option<CertificateInput>,
7374
pub(crate) ssl_client_key: Option<CertificateInput>,
@@ -101,6 +102,7 @@ impl MySqlConnectOptions {
101102
charset: String::from("utf8mb4"),
102103
collation: None,
103104
ssl_mode: MySqlSslMode::Preferred,
105+
tls_server_name: None,
104106
ssl_ca: None,
105107
ssl_client_cert: None,
106108
ssl_client_key: None,
@@ -123,6 +125,23 @@ impl MySqlConnectOptions {
123125
self
124126
}
125127

128+
/// Overrides the TLS server name used for SNI and hostname verification.
129+
///
130+
/// By default, the host from `MySqlConnectOptions` is used.
131+
///
132+
/// # Example
133+
///
134+
/// ```rust
135+
/// # use sqlx_mysql::MySqlConnectOptions;
136+
/// let _options = MySqlConnectOptions::new()
137+
/// .host("haproxy.example.com")
138+
/// .tls_server_name("mysql.example.com");
139+
/// ```
140+
pub fn tls_server_name(mut self, server_name: &str) -> Self {
141+
self.tls_server_name = Some(server_name.to_owned());
142+
self
143+
}
144+
126145
/// Sets the port to connect to at the server host.
127146
///
128147
/// The default port for MySQL is `3306`.
@@ -527,3 +546,14 @@ impl MySqlConnectOptions {
527546
self.collation.as_deref()
528547
}
529548
}
549+
550+
#[cfg(test)]
551+
mod tests {
552+
use super::MySqlConnectOptions;
553+
554+
#[test]
555+
fn tls_server_name_is_stored() {
556+
let opts = MySqlConnectOptions::new().tls_server_name("sni.example.com");
557+
assert_eq!(opts.tls_server_name.as_deref(), Some("sni.example.com"));
558+
}
559+
}

0 commit comments

Comments
 (0)