@@ -89,6 +89,7 @@ const URI_OPTIONS: &[&str] = &[
8989 "waitqueuetimeoutms" ,
9090 "wtimeoutms" ,
9191 "zlibcompressionlevel" ,
92+ "srvservicename" ,
9293] ;
9394
9495/// Reserved characters as defined by [Section 2.2 of RFC-3986](https://tools.ietf.org/html/rfc3986#section-2.2).
@@ -521,6 +522,9 @@ pub struct ClientOptions {
521522 /// By default, no default database is specified.
522523 pub default_database : Option < String > ,
523524
525+ /// Overrides the default "mongodb" service name for SRV lookup in both discovery and polling
526+ pub srv_service_name : Option < String > ,
527+
524528 #[ builder( setter( skip) ) ]
525529 #[ derivative( Debug = "ignore" ) ]
526530 pub ( crate ) socket_timeout : Option < Duration > ,
@@ -676,6 +680,8 @@ impl Serialize for ClientOptions {
676680 loadbalanced : & ' a Option < bool > ,
677681
678682 srvmaxhosts : Option < i32 > ,
683+
684+ srvservicename : & ' a Option < String > ,
679685 }
680686
681687 let client_options = ClientOptionsHelper {
@@ -709,6 +715,7 @@ impl Serialize for ClientOptions {
709715 . map ( |v| v. try_into ( ) )
710716 . transpose ( )
711717 . map_err ( serde:: ser:: Error :: custom) ?,
718+ srvservicename : & self . srv_service_name ,
712719 } ;
713720
714721 client_options. serialize ( serializer)
@@ -865,6 +872,9 @@ pub struct ConnectionString {
865872 /// Limit on the number of mongos connections that may be created for sharded topologies.
866873 pub srv_max_hosts : Option < u32 > ,
867874
875+ /// Overrides the default "mongodb" service name for SRV lookup in both discovery and polling
876+ pub srv_service_name : Option < String > ,
877+
868878 wait_queue_timeout : Option < Duration > ,
869879 tls_insecure : Option < bool > ,
870880
@@ -900,11 +910,16 @@ impl Default for HostInfo {
900910}
901911
902912impl HostInfo {
903- async fn resolve ( self , resolver_config : Option < ResolverConfig > ) -> Result < ResolvedHostInfo > {
913+ async fn resolve (
914+ self ,
915+ resolver_config : Option < ResolverConfig > ,
916+ srv_service_name : Option < String > ,
917+ ) -> Result < ResolvedHostInfo > {
904918 Ok ( match self {
905919 Self :: HostIdentifiers ( hosts) => ResolvedHostInfo :: HostIdentifiers ( hosts) ,
906920 Self :: DnsRecord ( hostname) => {
907- let mut resolver = SrvResolver :: new ( resolver_config. clone ( ) ) . await ?;
921+ let mut resolver =
922+ SrvResolver :: new ( resolver_config. clone ( ) , srv_service_name) . await ?;
908923 let config = resolver. resolve_client_options ( & hostname) . await ?;
909924 ResolvedHostInfo :: DnsRecord { hostname, config }
910925 }
@@ -1486,6 +1501,12 @@ impl ConnectionString {
14861501 ConnectionStringParts :: default ( )
14871502 } ;
14881503
1504+ if conn_str. srv_service_name . is_some ( ) && !srv {
1505+ return Err ( Error :: invalid_argument (
1506+ "srvServiceName cannot be specified with a non-SRV URI" ,
1507+ ) ) ;
1508+ }
1509+
14891510 if let Some ( srv_max_hosts) = conn_str. srv_max_hosts {
14901511 if !srv {
14911512 return Err ( Error :: invalid_argument (
@@ -1976,6 +1997,9 @@ impl ConnectionString {
19761997 k @ "srvmaxhosts" => {
19771998 self . srv_max_hosts = Some ( get_u32 ! ( value, k) ) ;
19781999 }
2000+ "srvservicename" => {
2001+ self . srv_service_name = Some ( value. to_string ( ) ) ;
2002+ }
19792003 k @ "tls" | k @ "ssl" => {
19802004 let tls = get_bool ! ( value, k) ;
19812005
0 commit comments