58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package parseurl
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// Target is host, port, secret string from tg://proxy or explicit flags.
|
|
type Target struct {
|
|
Host string
|
|
Port int
|
|
Secret string
|
|
}
|
|
|
|
// ParseTGProxy parses tg://proxy?server=&port=&secret= or t.me/proxy style query.
|
|
func ParseTGProxy(raw string) (*Target, error) {
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" {
|
|
return nil, fmt.Errorf("empty proxy url")
|
|
}
|
|
|
|
u, err := url.Parse(raw)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if u.Scheme != "tg" {
|
|
return nil, fmt.Errorf("expected tg:// scheme, got %q", u.Scheme)
|
|
}
|
|
|
|
host := u.Hostname()
|
|
if host != "" && host != "proxy" {
|
|
return nil, fmt.Errorf("unexpected tg host %q", host)
|
|
}
|
|
|
|
q := u.Query()
|
|
server := strings.TrimSpace(q.Get("server"))
|
|
if server == "" {
|
|
return nil, fmt.Errorf("missing server parameter")
|
|
}
|
|
portStr := strings.TrimSpace(q.Get("port"))
|
|
if portStr == "" {
|
|
return nil, fmt.Errorf("missing port parameter")
|
|
}
|
|
port, err := strconv.Atoi(portStr)
|
|
if err != nil || port < 1 || port > 65535 {
|
|
return nil, fmt.Errorf("invalid port %q", portStr)
|
|
}
|
|
sec := strings.TrimSpace(q.Get("secret"))
|
|
if sec == "" {
|
|
return nil, fmt.Errorf("missing secret parameter")
|
|
}
|
|
|
|
return &Target{Host: server, Port: port, Secret: sec}, nil
|
|
}
|