@@ -33,37 +33,30 @@ func init() {
3333}
3434
3535func getPlainListener (_ context.Context , _ string , addr string , _ net.ListenConfig ) (any , error ) {
36- network , host , port , err := caddy . SplitNetworkAddress (addr )
36+ controlURL , network , host , port , err := parseAddr (addr )
3737 if err != nil {
3838 return nil , err
3939 }
4040
41- s , err := getServer ("" , host )
41+ s , err := getServer ("" , host , controlURL )
4242 if err != nil {
4343 return nil , err
4444 }
4545
46- if network == "" {
47- network = "tcp"
48- }
49-
5046 return s .Listen (network , ":" + port )
5147}
5248
5349func getTLSListener (_ context.Context , _ string , addr string , _ net.ListenConfig ) (any , error ) {
54- network , host , port , err := caddy . SplitNetworkAddress (addr )
50+ controlURL , network , host , port , err := parseAddr (addr )
5551 if err != nil {
5652 return nil , err
5753 }
5854
59- s , err := getServer ("" , host )
55+ s , err := getServer ("" , host , controlURL )
6056 if err != nil {
6157 return nil , err
6258 }
6359
64- if network == "" {
65- network = "tcp"
66- }
6760 ln , err := s .Listen (network , ":" + port )
6861 if err != nil {
6962 return nil , err
@@ -86,7 +79,7 @@ func getTLSListener(_ context.Context, _ string, addr string, _ net.ListenConfig
8679//
8780// Auth keys can be provided in environment variables of the form TS_AUTHKEY_<HOST>. If
8881// no host is specified in the address, the environment variable TS_AUTHKEY will be used.
89- func getServer (_ , addr string ) (* tsnetServerDestructor , error ) {
82+ func getServer (_ , addr string , controlURL string ) (* tsnetServerDestructor , error ) {
9083 _ , host , _ , err := caddy .SplitNetworkAddress (addr )
9184 if err != nil {
9285 return nil , err
@@ -104,10 +97,9 @@ func getServer(_, addr string) (*tsnetServerDestructor, error) {
10497 },
10598 }
10699
107- // Setting ControlURL to "TS_CONTROL_URL". If empty or not found will default to default of tsnet "https://controlplane.tailscale.com"
108- controlUrl , controlUrlFound := os .LookupEnv ("TS_CONTROL_URL" )
109- if controlUrlFound && controlUrl != "" {
110- s .ControlURL = controlUrl
100+ // Setting ControlURL. If empty or not found will default to default of tsnet "https://controlplane.tailscale.com"
101+ if controlURL != "" {
102+ s .ControlURL = controlURL
111103 }
112104
113105 if host != "" {
@@ -233,6 +225,34 @@ func parseCaddyfile(_ httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
233225 }, nil
234226}
235227
228+ func parseAddr (addr string ) (controlURL , network , host , port string , err error ) {
229+ controlURL = ""
230+
231+ network , host , port , err = caddy .SplitNetworkAddress (addr )
232+ if err != nil {
233+ return "" , "" , "" , "" , err
234+ }
235+
236+ switch network {
237+ case "" , "tcp" , "tcp4" , "tcp6" , "udp" , "udp4" , "udp6" :
238+ default :
239+ controlURL = fmt .Sprintf ("https://%s" , network )
240+ network = "tcp"
241+ beforeSlash , afterSlash , slashFound := strings .Cut (host , "/" )
242+ if slashFound {
243+ switch beforeSlash {
244+ case "" , "tcp" , "tcp4" , "tcp6" , "udp" , "udp4" , "udp6" :
245+ network = beforeSlash
246+ host = afterSlash
247+ default :
248+ network = "tcp"
249+ }
250+ }
251+ }
252+
253+ return controlURL , network , host , port , nil
254+ }
255+
236256type tsnetServerDestructor struct {
237257 * tsnet.Server
238258}
0 commit comments