pkg/core/node.go
package core
import (
"errors"
"net/url"
"strconv"
"strings"
)
var ErrorInvalidNode = errors.New("invalid node")
type Node struct {
Addr string
Protocol string
Remote string // remote address, used by tcp/udp port forwarding
Values url.Values
Client *Client
}
// ParseNode pattern is [scheme://][user:pass@host]:port.
func ParseNode(s string) (*Node, error) {
s = strings.TrimSpace(s)
if len(s) == 0 {
return nil, ErrorInvalidNode
}
u, err := url.Parse(s)
if err != nil {
return nil, err
}
node := &Node{
Addr: u.Host,
Remote: strings.Trim(u.EscapedPath(), "/"),
Values: u.Query(),
Protocol: u.Scheme,
}
return node, nil
}
// Get returns node parameter specified by key.
func (node *Node) Get(key string) string {
values := node.Values[key]
for _, value := range values {
if value != "" {
return value
}
}
return node.Values.Get(key)
}
// GetInt converts node parameter value to int.
func (node *Node) GetInt(key string) int {
n, _ := strconv.Atoi(node.Get(key))
return n
}