From 115fba4ff4d1a4130d17c2f3100115e69ec93067 Mon Sep 17 00:00:00 2001 From: yusing Date: Wed, 18 Feb 2026 14:37:23 +0800 Subject: [PATCH] feat(route): allow empty listening port in port specification Support the ":proxy" format where only the proxy port is specified. When the listening port part is empty, it defaults to 0 instead of returning a parse error. --- internal/route/types/port.go | 6 +++++- internal/route/types/port_test.go | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/internal/route/types/port.go b/internal/route/types/port.go index a50a545f..e2a06ca3 100644 --- a/internal/route/types/port.go +++ b/internal/route/types/port.go @@ -27,7 +27,11 @@ func (p *Port) Parse(v string) (err error) { p.Proxy, err = strconv.Atoi(v) case 2: var err2 error - p.Listening, err = strconv.Atoi(parts[0]) + if parts[0] == "" { + p.Listening = 0 + } else { + p.Listening, err = strconv.Atoi(parts[0]) + } p.Proxy, err2 = strconv.Atoi(parts[1]) err = gperr.Join(err, err2) default: diff --git a/internal/route/types/port_test.go b/internal/route/types/port_test.go index 28b7d3e4..34ff870e 100644 --- a/internal/route/types/port_test.go +++ b/internal/route/types/port_test.go @@ -10,7 +10,6 @@ var invalidPorts = []string{ "", "123:", "0:", - ":1234", "qwerty", "asdfgh:asdfgh", "1234:asdfgh", @@ -78,6 +77,14 @@ func TestPortValid(t *testing.T) { Proxy: 5678, }, }, + { + name: "valid_lp_empty", + inputs: ":1234", + expect: Port{ + Listening: 0, + Proxy: 1234, + }, + }, { name: "valid_p", inputs: "5678",