From e2f96687ffb7e99710b7a59863131d0ca507b830 Mon Sep 17 00:00:00 2001 From: Parviz Miriyev Date: Tue, 28 Apr 2026 10:10:11 +0400 Subject: [PATCH] fix(admin): use protocol-relative URLs for component links so HTTPS clusters don't break clicks (#9256) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(admin): use protocol-relative URLs for component links Hardcoded http:// in admin UI templates breaks browser-initiated clicks to master / volume / filer / EC shard / Iceberg REST URLs whenever the target component runs HTTPS-only via security.toml [https.X] sections. The browser sends plain HTTP to a TLS-only endpoint and gets 400 "client sent an HTTP request to an HTTPS server". Same root pattern as #9227 (admin's own backend /dir/status fetch); this PR is the browser-facing equivalent. Replace fmt.Sprintf("http://%s...") with fmt.Sprintf("//%s...") and the JS-string ':/v1/config. Apply the same protocol-relative fix to the JS template literals so they don't undo the templ-side change. Browser uses the page scheme (http or https) to fill in the protocol. Mirrored in iceberg_catalog_templ.go and s3tables_buckets_templ.go. * fix(admin): displayed Iceberg endpoint scheme follows page protocol Per CodeRabbit review on this PR: the on-page guidance text in iceberg and s3tables templates still showed a literal `http://` even after the clickable link was switched to a protocol-relative URL. In HTTPS-only deployments operators see `http://host:8181/v1` as the suggested endpoint, copy it, and get a broken connection. Wrap the scheme in (and the s3tables counterpart) and have the existing inline script set its innerText to window.location.protocol minus the trailing colon. Same pattern as the existing dynamic host substitution. Mirrored in *_templ.go so reviewers do not need templ generate. SQL/JSON code-block examples (CREATE EXTERNAL TABLE ... ENDPOINT 'http://...', "uri": "http://..." ) are intentionally left as-is — they are starter snippets users adapt to their environment, not clickable or copy-paste-into-runtime values. Happy to follow up with server-side scheme threading if requested. --- weed/admin/view/app/admin.templ | 6 +++--- weed/admin/view/app/admin_templ.go | 6 +++--- weed/admin/view/app/cluster_filers.templ | 2 +- weed/admin/view/app/cluster_filers_templ.go | 2 +- weed/admin/view/app/cluster_masters.templ | 4 ++-- weed/admin/view/app/cluster_masters_templ.go | 4 ++-- weed/admin/view/app/cluster_volume_servers.templ | 6 +++--- weed/admin/view/app/cluster_volume_servers_templ.go | 6 +++--- weed/admin/view/app/cluster_volumes.templ | 2 +- weed/admin/view/app/cluster_volumes_templ.go | 2 +- weed/admin/view/app/ec_volume_details.templ | 2 +- weed/admin/view/app/ec_volume_details_templ.go | 2 +- weed/admin/view/app/iceberg_catalog.templ | 11 ++++++++--- weed/admin/view/app/iceberg_catalog_templ.go | 6 +++--- weed/admin/view/app/s3tables_buckets.templ | 11 ++++++++--- weed/admin/view/app/s3tables_buckets_templ.go | 6 +++--- weed/admin/view/app/volume_details.templ | 6 +++--- weed/admin/view/app/volume_details_templ.go | 6 +++--- 18 files changed, 50 insertions(+), 40 deletions(-) diff --git a/weed/admin/view/app/admin.templ b/weed/admin/view/app/admin.templ index d8a20ba48..27e72719f 100644 --- a/weed/admin/view/app/admin.templ +++ b/weed/admin/view/app/admin.templ @@ -173,7 +173,7 @@ templ Admin(data dash.AdminData) { for _, master := range data.MasterNodes { - + {master.Address} @@ -280,7 +280,7 @@ templ Admin(data dash.AdminData) { {vs.ID} - + {vs.GetDisplayAddress()} @@ -358,7 +358,7 @@ templ Admin(data dash.AdminData) { for _, filer := range data.FilerNodes { - + {filer.Address} diff --git a/weed/admin/view/app/admin_templ.go b/weed/admin/view/app/admin_templ.go index e3152ba52..37acf42b7 100644 --- a/weed/admin/view/app/admin_templ.go +++ b/weed/admin/view/app/admin_templ.go @@ -135,7 +135,7 @@ func Admin(data dash.AdminData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var9 templ.SafeURL - templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", master.Address))) + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", master.Address))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/admin.templ`, Line: 176, Col: 126} } @@ -277,7 +277,7 @@ func Admin(data dash.AdminData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var18 templ.SafeURL - templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", vs.GetDisplayAddress()))) + templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", vs.GetDisplayAddress()))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/admin.templ`, Line: 283, Col: 134} } @@ -470,7 +470,7 @@ func Admin(data dash.AdminData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var30 templ.SafeURL - templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s", filer.Address))) + templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s", filer.Address))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/admin.templ`, Line: 361, Col: 111} } diff --git a/weed/admin/view/app/cluster_filers.templ b/weed/admin/view/app/cluster_filers.templ index 023fd4478..b20025662 100644 --- a/weed/admin/view/app/cluster_filers.templ +++ b/weed/admin/view/app/cluster_filers.templ @@ -68,7 +68,7 @@ templ ClusterFilers(data dash.ClusterFilersData) { for _, filer := range data.Filers { - + { filer.Address } diff --git a/weed/admin/view/app/cluster_filers_templ.go b/weed/admin/view/app/cluster_filers_templ.go index 2c2d58c45..27b483ad4 100644 --- a/weed/admin/view/app/cluster_filers_templ.go +++ b/weed/admin/view/app/cluster_filers_templ.go @@ -62,7 +62,7 @@ func ClusterFilers(data dash.ClusterFilersData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var3 templ.SafeURL - templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s", filer.Address))) + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s", filer.Address))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/cluster_filers.templ`, Line: 71, Col: 75} } diff --git a/weed/admin/view/app/cluster_masters.templ b/weed/admin/view/app/cluster_masters.templ index 6a53c5493..05e2e1bd9 100644 --- a/weed/admin/view/app/cluster_masters.templ +++ b/weed/admin/view/app/cluster_masters.templ @@ -110,7 +110,7 @@ templ ClusterMasters(data dash.ClusterMastersData) { for _, master := range data.Masters { - + { master.Address } @@ -219,7 +219,7 @@ templ ClusterMasters(data dash.ClusterMastersData) { '
' + '
Quick Actions
' + '' + diff --git a/weed/admin/view/app/cluster_masters_templ.go b/weed/admin/view/app/cluster_masters_templ.go index aa0c2d19b..9181ef46b 100644 --- a/weed/admin/view/app/cluster_masters_templ.go +++ b/weed/admin/view/app/cluster_masters_templ.go @@ -90,7 +90,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var4 templ.SafeURL - templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s", master.Address))) + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s", master.Address))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/cluster_masters.templ`, Line: 113, Col: 76} } @@ -221,7 +221,7 @@ func ClusterMasters(data dash.ClusterMastersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/cluster_volume_servers.templ b/weed/admin/view/app/cluster_volume_servers.templ index 06d82d31c..aa1bc7516 100644 --- a/weed/admin/view/app/cluster_volume_servers.templ +++ b/weed/admin/view/app/cluster_volume_servers.templ @@ -114,12 +114,12 @@ templ ClusterVolumeServers(data dash.ClusterVolumeServersData) { if host.PublicURL != "" { - + {host.Address} } else { - + {host.Address} @@ -334,7 +334,7 @@ templ ClusterVolumeServers(data dash.ClusterVolumeServersData) { '
' + '
Quick Actions
' + '
' + - '' + + '' + 'Open Volume Server UI' + '' + '' + diff --git a/weed/admin/view/app/cluster_volume_servers_templ.go b/weed/admin/view/app/cluster_volume_servers_templ.go index 674ee561a..d59cfacee 100644 --- a/weed/admin/view/app/cluster_volume_servers_templ.go +++ b/weed/admin/view/app/cluster_volume_servers_templ.go @@ -93,7 +93,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var5 templ.SafeURL - templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", host.PublicURL))) + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", host.PublicURL))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/cluster_volume_servers.templ`, Line: 117, Col: 126} } @@ -124,7 +124,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var7 templ.SafeURL - templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", host.Address))) + templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", host.Address))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/cluster_volume_servers.templ`, Line: 122, Col: 124} } @@ -656,7 +656,7 @@ func ClusterVolumeServers(data dash.ClusterVolumeServersData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/cluster_volumes.templ b/weed/admin/view/app/cluster_volumes.templ index 34bcc89df..7cee0474e 100644 --- a/weed/admin/view/app/cluster_volumes.templ +++ b/weed/admin/view/app/cluster_volumes.templ @@ -320,7 +320,7 @@ templ ClusterVolumes(data dash.ClusterVolumesData) { - + {volume.Server} diff --git a/weed/admin/view/app/cluster_volumes_templ.go b/weed/admin/view/app/cluster_volumes_templ.go index e59bcf484..fcc963b97 100644 --- a/weed/admin/view/app/cluster_volumes_templ.go +++ b/weed/admin/view/app/cluster_volumes_templ.go @@ -496,7 +496,7 @@ func ClusterVolumes(data dash.ClusterVolumesData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var18 templ.SafeURL - templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", volume.Server))) + templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", volume.Server))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/cluster_volumes.templ`, Line: 323, Col: 121} } diff --git a/weed/admin/view/app/ec_volume_details.templ b/weed/admin/view/app/ec_volume_details.templ index 0131c43c9..c60191a7c 100644 --- a/weed/admin/view/app/ec_volume_details.templ +++ b/weed/admin/view/app/ec_volume_details.templ @@ -266,7 +266,7 @@ templ EcVolumeDetails(data dash.EcVolumeDetailsData) { {bytesToHumanReadableUint64(shard.Size)} - + Volume Server diff --git a/weed/admin/view/app/ec_volume_details_templ.go b/weed/admin/view/app/ec_volume_details_templ.go index da16ac4ac..bc43aea1d 100644 --- a/weed/admin/view/app/ec_volume_details_templ.go +++ b/weed/admin/view/app/ec_volume_details_templ.go @@ -525,7 +525,7 @@ func EcVolumeDetails(data dash.EcVolumeDetailsData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var23 templ.SafeURL - templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", shard.Server))) + templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", shard.Server))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/ec_volume_details.templ`, Line: 269, Col: 121} } diff --git a/weed/admin/view/app/iceberg_catalog.templ b/weed/admin/view/app/iceberg_catalog.templ index bd1fe0ab7..04dd13c60 100644 --- a/weed/admin/view/app/iceberg_catalog.templ +++ b/weed/admin/view/app/iceberg_catalog.templ @@ -20,7 +20,7 @@ templ IcebergCatalog(data dash.IcebergCatalogData) {
- + REST API
@@ -35,16 +35,21 @@ templ IcebergCatalog(data dash.IcebergCatalogData) { Iceberg REST Catalog

Connect your Iceberg clients (DuckDB, Spark, etc.) to: - http://localhost:{fmt.Sprintf("%d", data.IcebergPort)}/v1 + http://localhost:{fmt.Sprintf("%d", data.IcebergPort)}/v1

diff --git a/weed/admin/view/app/iceberg_catalog_templ.go b/weed/admin/view/app/iceberg_catalog_templ.go index a8bf3182c..704d89c19 100644 --- a/weed/admin/view/app/iceberg_catalog_templ.go +++ b/weed/admin/view/app/iceberg_catalog_templ.go @@ -55,7 +55,7 @@ func IcebergCatalog(data dash.IcebergCatalogData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var3 templ.SafeURL - templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://localhost:%d/v1/config", data.IcebergPort))) + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//localhost:%d/v1/config", data.IcebergPort))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/iceberg_catalog.templ`, Line: 23, Col: 114} } @@ -76,7 +76,7 @@ func IcebergCatalog(data dash.IcebergCatalogData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "\">Connect your Iceberg clients (DuckDB, Spark, etc.) to: http://localhost:") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "\">Connect your Iceberg clients (DuckDB, Spark, etc.) to: http://localhost:") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -89,7 +89,7 @@ func IcebergCatalog(data dash.IcebergCatalogData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "/v1

Catalogs (Table Buckets)
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "/v1

Catalogs (Table Buckets)
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/s3tables_buckets.templ b/weed/admin/view/app/s3tables_buckets.templ index 078d8ec65..4d366c47d 100644 --- a/weed/admin/view/app/s3tables_buckets.templ +++ b/weed/admin/view/app/s3tables_buckets.templ @@ -21,7 +21,7 @@ templ S3TablesBuckets(data dash.S3TablesBucketsData) {
if data.IcebergPort > 0 { @@ -37,16 +37,21 @@ templ S3TablesBuckets(data dash.S3TablesBucketsData) { Iceberg REST Catalog

Each table bucket is an Iceberg catalog. Connect clients to: - http://localhost:{ fmt.Sprintf("%d", data.IcebergPort) }/v1 + http://localhost:{ fmt.Sprintf("%d", data.IcebergPort) }/v1

diff --git a/weed/admin/view/app/s3tables_buckets_templ.go b/weed/admin/view/app/s3tables_buckets_templ.go index 30d775554..2ae65001a 100644 --- a/weed/admin/view/app/s3tables_buckets_templ.go +++ b/weed/admin/view/app/s3tables_buckets_templ.go @@ -47,7 +47,7 @@ func S3TablesBuckets(data dash.S3TablesBucketsData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var2 templ.SafeURL - templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://localhost:%d/v1/config", data.IcebergPort))) + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//localhost:%d/v1/config", data.IcebergPort))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/s3tables_buckets.templ`, Line: 24, Col: 124} } @@ -91,7 +91,7 @@ func S3TablesBuckets(data dash.S3TablesBucketsData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\">Each table bucket is an Iceberg catalog. Connect clients to: http://localhost:") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "\">Each table bucket is an Iceberg catalog. Connect clients to: http://localhost:") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -104,7 +104,7 @@ func S3TablesBuckets(data dash.S3TablesBucketsData) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "/v1

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "/v1

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/weed/admin/view/app/volume_details.templ b/weed/admin/view/app/volume_details.templ index dc3ea5900..8fae65d2e 100644 --- a/weed/admin/view/app/volume_details.templ +++ b/weed/admin/view/app/volume_details.templ @@ -51,7 +51,7 @@ templ VolumeDetails(data dash.VolumeDetailsData) {
- + {data.Volume.Server} @@ -298,7 +298,7 @@ templ VolumeDetails(data dash.VolumeDetailsData) { - + {data.Volume.Server} @@ -318,7 +318,7 @@ templ VolumeDetails(data dash.VolumeDetailsData) { for _, replica := range data.Replicas { - + {replica.Server} diff --git a/weed/admin/view/app/volume_details_templ.go b/weed/admin/view/app/volume_details_templ.go index b5335cfe3..2dfa2d844 100644 --- a/weed/admin/view/app/volume_details_templ.go +++ b/weed/admin/view/app/volume_details_templ.go @@ -92,7 +92,7 @@ func VolumeDetails(data dash.VolumeDetailsData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var6 templ.SafeURL - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", data.Volume.Server))) + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", data.Volume.Server))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/volume_details.templ`, Line: 54, Col: 118} } @@ -500,7 +500,7 @@ func VolumeDetails(data dash.VolumeDetailsData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var30 templ.SafeURL - templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", data.Volume.Server))) + templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", data.Volume.Server))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/volume_details.templ`, Line: 301, Col: 130} } @@ -583,7 +583,7 @@ func VolumeDetails(data dash.VolumeDetailsData) templ.Component { return templ_7745c5c3_Err } var templ_7745c5c3_Var36 templ.SafeURL - templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("http://%s/ui/index.html", replica.Server))) + templ_7745c5c3_Var36, templ_7745c5c3_Err = templ.JoinURLErrs(templ.SafeURL(fmt.Sprintf("//%s/ui/index.html", replica.Server))) if templ_7745c5c3_Err != nil { return templ.Error{Err: templ_7745c5c3_Err, FileName: `weed/admin/view/app/volume_details.templ`, Line: 321, Col: 126} }