feat: add IDNA decoding for proxy hostnames in webclient

- Decode virtual host using golang.org/x/net/idna package - Extract uppercase ID from decoded hostname for routing - Remove unused initDone channel - Update dependencies: add golang.org/x/net and golang.org/x/text - Improve error logging with proxied URL details This change enables better support for internationalized domain names in proxy requests and cleans up unused code. The ID extraction allows for proper host routing based on virtual domains.

lemon-mint committed Oct 30, 2025 at 23:24 UTC 4ff7e48e19faba0d96fc181fce99b2a318d070c3
3 files changed +20 -3
cmd/webclient/main_js.go
+14 -3
@@ -15,12 +15,12 @@ import (
15 "github.com/gosuda/portal/sdk"
16 "github.com/rs/zerolog"
17 "github.com/rs/zerolog/log"
18 + "golang.org/x/net/idna"
19 )
20
21 var (
22 bootstrapServers = []string{"ws://localhost:4017/relay"}
23 rdClient *sdk.RDClient
23 - initDone chan struct{} = make(chan struct{}, 1)
24 )
25
26 var client = &http.Client{
@@ -45,10 +45,21 @@ type Proxy struct {
45
46 func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
47 log.Info().Msgf("Proxying request to %s", r.URL.String())
48 - r.URL.Host = "UOJ4VGIKICVKHXFURAE67GUHMMELUAUU3I37NCAAPHAAHBMPYDNQ"
48 +
49 + host, err := idna.ToUnicode(r.URL.Hostname())
50 + if err != nil {
51 + host = r.URL.Hostname()
52 + }
53 + id := strings.Split(host, ".")[0]
54 + id = strings.TrimSpace(id)
55 + id = strings.ToUpper(id)
56 +
57 + r = r.Clone(context.Background())
58 + r.URL.Host = id
59 +
60 resp, err := client.Do(r)
61 if err != nil {
51 - log.Error().Err(err).Msg("Failed to proxy request")
62 + log.Error().Err(err).Msgf("Failed to proxy request to %s", r.URL.String())
63 return
64 }
65 defer resp.Body.Close()
go.mod
+2
@@ -10,6 +10,7 @@ require (
10 github.com/spf13/cobra v1.10.1
11 github.com/valyala/bytebufferpool v1.0.0
12 golang.org/x/crypto v0.43.0
13 + golang.org/x/net v0.46.0
14 google.golang.org/protobuf v1.36.10
15 )
16
@@ -19,4 +20,5 @@ require (
20 github.com/mattn/go-isatty v0.0.19 // indirect
21 github.com/spf13/pflag v1.0.9 // indirect
22 golang.org/x/sys v0.37.0 // indirect
23 + golang.org/x/text v0.30.0 // indirect
24 )
go.sum
+4
@@ -29,11 +29,15 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
29 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
30 golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
31 golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
32 +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
33 +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
34 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
35 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
36 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
37 golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
38 golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
39 +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
40 +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
41 google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
42 google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
43 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=