@@ -29,20 +29,42 @@ impl AppAddress {
2929}
3030
3131/// resolve app address by sni
32- async fn resolve_app_address ( prefix : & str , sni : & str ) -> Result < AppAddress > {
32+ async fn resolve_app_address ( prefix : & str , sni : & str , compat : bool ) -> Result < AppAddress > {
3333 let txt_domain = format ! ( "{prefix}.{sni}" ) ;
3434 let resolver = hickory_resolver:: AsyncResolver :: tokio_from_system_conf ( )
3535 . context ( "failed to create dns resolver" ) ?;
36- let lookup = resolver
37- . txt_lookup ( txt_domain)
38- . await
39- . context ( "failed to lookup app address" ) ?;
40- let txt_record = lookup. iter ( ) . next ( ) . context ( "no txt record found" ) ?;
41- let data = txt_record
42- . txt_data ( )
43- . first ( )
44- . context ( "no data in txt record" ) ?;
45- AppAddress :: parse ( data) . context ( "failed to parse app address" )
36+
37+ if compat && prefix != "_tapp-address" {
38+ let txt_domain_legacy = format ! ( "_tapp-address.{sni}" ) ;
39+ let ( lookup, lookup_legacy) = tokio:: join!(
40+ resolver. txt_lookup( txt_domain) ,
41+ resolver. txt_lookup( txt_domain_legacy) ,
42+ ) ;
43+ for lookup in [ lookup, lookup_legacy] {
44+ let Ok ( lookup) = lookup else {
45+ continue ;
46+ } ;
47+ let Some ( txt_record) = lookup. iter ( ) . next ( ) else {
48+ continue ;
49+ } ;
50+ let Some ( data) = txt_record. txt_data ( ) . first ( ) else {
51+ continue ;
52+ } ;
53+ return AppAddress :: parse ( data) . context ( "failed to parse app address" ) ;
54+ }
55+ anyhow:: bail!( "failed to resolve app address" ) ;
56+ } else {
57+ let lookup = resolver
58+ . txt_lookup ( txt_domain)
59+ . await
60+ . context ( "failed to lookup app address" ) ?;
61+ let txt_record = lookup. iter ( ) . next ( ) . context ( "no txt record found" ) ?;
62+ let data = txt_record
63+ . txt_data ( )
64+ . first ( )
65+ . context ( "no data in txt record" ) ?;
66+ AppAddress :: parse ( data) . context ( "failed to parse app address" )
67+ }
4668}
4769
4870pub ( crate ) async fn proxy_with_sni (
@@ -51,7 +73,9 @@ pub(crate) async fn proxy_with_sni(
5173 buffer : Vec < u8 > ,
5274 sni : & str ,
5375) -> Result < ( ) > {
54- let addr = resolve_app_address ( & state. config . proxy . app_address_ns_prefix , sni)
76+ let ns_prefix = & state. config . proxy . app_address_ns_prefix ;
77+ let compat = state. config . proxy . app_address_ns_compat ;
78+ let addr = resolve_app_address ( ns_prefix, sni, compat)
5579 . await
5680 . context ( "failed to resolve app address" ) ?;
5781 debug ! ( "target address is {}:{}" , addr. app_id, addr. port) ;
@@ -123,6 +147,7 @@ mod tests {
123147 let app_addr = resolve_app_address (
124148 "_dstack-app-address" ,
125149 "3327603e03f5bd1f830812ca4a789277fc31f577.app.kvin.wang" ,
150+ false ,
126151 )
127152 . await
128153 . unwrap ( ) ;
0 commit comments