@@ -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