Newer
Older
"fmt"
"net"
"net/url"
"strconv"
"strings"
"time"
)
import (
jerrors "github.com/juju/errors"
)
type IURL interface {
Key() string
URLEqual(IURL) bool
Context() context.Context
GetParam(string, string) string
GetParamInt(string, int64) int64
String() string
Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty"`
Location string // ip+port
Ip string
Port string
Timeout time.Duration
Path string `yaml:"path" json:"path,omitempty"` // like /com.ikurento.dubbo.UserProvider3
Version string `yaml:"version" json:"version,omitempty"`
Group string `yaml:"group" json:"group,omitempty"`
Username string
Password string
type option func(*URL)
func WithUsername(username string) option {
return func(url *URL) {
url.Username = username
}
}
func WithPassword(pwd string) option {
return func(url *URL) {
url.Password = pwd
}
}
func WithParams(params url.Values) option {
return func(url *URL) {
url.Params = params
}
}
func NewURLWithOptions(service string, protocol string, ip string, port string, path string, opts ...option) *URL {
url := &URL{
baseUrl: baseUrl{Protocol: protocol, Ip: ip, Port: port},
Service: service,
Path: path,
}
for _, opt := range opts {
opt(url)
}
return url
}
func NewURL(ctx context.Context, urlString string) (*URL, error) {
var (
err error
rawUrlString string
serviceUrl *url.URL
// new a null instance
if urlString == "" {
return s, nil
}
rawUrlString, err = url.QueryUnescape(urlString)
if err != nil {
return nil, jerrors.Errorf("url.QueryUnescape(%s), error{%v}", urlString, err)
}
serviceUrl, err = url.Parse(rawUrlString)
if err != nil {
return nil, jerrors.Errorf("url.Parse(url string{%s}), error{%v}", rawUrlString, err)
}
s.Params, err = url.ParseQuery(serviceUrl.RawQuery)
if err != nil {
return nil, jerrors.Errorf("url.ParseQuery(raw url string{%s}), error{%v}", serviceUrl.RawQuery, err)
}
s.PrimitiveURL = urlString
s.Protocol = serviceUrl.Scheme
s.Username = serviceUrl.User.Username()
s.Password, _ = serviceUrl.User.Password()
s.Location = serviceUrl.Host
s.Path = serviceUrl.Path
if strings.Contains(s.Location, ":") {
s.Ip, s.Port, err = net.SplitHostPort(s.Location)
return nil, jerrors.Errorf("net.SplitHostPort(Url.Host{%s}), error{%v}", s.Location, err)
s.Group = s.Params.Get("group")
s.Version = s.Params.Get("version")
}
if len(timeoutStr) != 0 {
timeout, err := strconv.Atoi(timeoutStr)
if err == nil && timeout != 0 {
s.Timeout = time.Duration(timeout * 1e6) // timeout unit is millisecond
return fmt.Sprintf("%s@%s-%s-%s-%s", c.Service, c.Protocol, c.Group, c.Location, c.Version)
return fmt.Sprintf(
"DefaultServiceURL{Protocol:%s, Location:%s, Path:%s, Ip:%s, Port:%s, "+
"Timeout:%s, Version:%s, Group:%s, Params:%+v}",
c.Timeout, c.Version, c.Group, c.Params)
func (c *URL) ToFullString() string {
buildString := fmt.Sprintf(
"%s://%s:%s@%s:%s/%s?verison=%s&group=%s",
c.Protocol, c.Username, c.Password, c.Ip, c.Port, c.Path, c.Version, c.Group)
for k, v := range c.Params {
buildString += "&" + k + "=" + v[0]
}
return buildString
}
func (c *URL) Context() context.Context {
return c.ctx
}
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
func (c *URL) GetParam(s string, d string) string {
var r string
if r = c.Params.Get(s); r == "" {
r = d
}
return r
}
func (c *URL) GetParamInt(s string, d int64) int64 {
var r int
var err error
if r, err = strconv.Atoi(c.Params.Get(s)); r == 0 || err != nil {
return d
}
return int64(r)
}
func (c *URL) GetMethodParamInt(method string, key string, d int64) int64 {
var r int
var err error
if r, err = strconv.Atoi(c.Params.Get("methods." + method + "." + key)); r == 0 || err != nil {
return d
}
return int64(r)
}
func (c *URL) GetMethodParam(method string, key string, d string) string {
var r string
if r = c.Params.Get(c.Params.Get("methods." + method + "." + key)); r == "" {
r = d
}
return r
}