You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
106 lines
2.5 KiB
package url
|
|
|
|
import (
|
|
"net/url"
|
|
"regexp"
|
|
"strings"
|
|
|
|
c "gopkg.in/h2non/gentleman.v2/context"
|
|
p "gopkg.in/h2non/gentleman.v2/plugin"
|
|
)
|
|
|
|
// URL parses and defines a new URL in the outgoing request
|
|
func URL(uri string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
u, err := url.Parse(normalize(uri))
|
|
if err != nil {
|
|
h.Error(ctx, err)
|
|
return
|
|
}
|
|
|
|
ctx.Request.URL = u
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// BaseURL parses and defines a schema and host URL values in the outgoing request
|
|
func BaseURL(uri string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
u, err := url.Parse(normalize(uri))
|
|
if err != nil {
|
|
h.Error(ctx, err)
|
|
return
|
|
}
|
|
|
|
ctx.Request.URL.Scheme = u.Scheme
|
|
ctx.Request.URL.Host = u.Host
|
|
|
|
if u.Path != "" && u.Path != "/" {
|
|
ctx.Request.URL.Path = normalizePath(u.Path)
|
|
}
|
|
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// Path defines a new URL path in the outgoing request
|
|
func Path(path string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
ctx.Request.URL.Path = normalizePath(path)
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// AddPath concatenates a path slice to the existent path in the outgoing request
|
|
func AddPath(path string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
ctx.Request.URL.Path += normalizePath(path)
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// PathPrefix defines a path prefix to the existent path in the outgoing request
|
|
func PathPrefix(path string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
ctx.Request.URL.Path = normalizePath(path) + ctx.Request.URL.Path
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// Param replaces one or multiple path param expressions by the given value
|
|
func Param(key, value string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
ctx.Request.URL.Path = replace(ctx.Request.URL.Path, key, value)
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
// Params replaces one or multiple path param expressions by the given map of key-value pairs
|
|
func Params(params map[string]string) p.Plugin {
|
|
return p.NewRequestPlugin(func(ctx *c.Context, h c.Handler) {
|
|
for key, value := range params {
|
|
ctx.Request.URL.Path = replace(ctx.Request.URL.Path, key, value)
|
|
}
|
|
h.Next(ctx)
|
|
})
|
|
}
|
|
|
|
func replace(str, key, value string) string {
|
|
return strings.Replace(str, ":"+key, value, -1)
|
|
}
|
|
|
|
func normalizePath(path string) string {
|
|
if path == "/" {
|
|
return ""
|
|
}
|
|
return path
|
|
}
|
|
|
|
func normalize(uri string) string {
|
|
match, _ := regexp.MatchString("^http[s]?://", uri)
|
|
if match {
|
|
return uri
|
|
}
|
|
return "http://" + uri
|
|
}
|