83 lines
1.3 KiB
Go
83 lines
1.3 KiB
Go
package h
|
|
|
|
import (
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
type Qs struct {
|
|
m map[string]string
|
|
}
|
|
|
|
func NewQs(pairs ...string) *Qs {
|
|
q := &Qs{
|
|
m: make(map[string]string),
|
|
}
|
|
if len(pairs)%2 != 0 {
|
|
return q
|
|
}
|
|
for i := 0; i < len(pairs); i++ {
|
|
q.m[pairs[i]] = pairs[i+1]
|
|
i++
|
|
}
|
|
return q
|
|
}
|
|
|
|
func (q *Qs) Add(key string, value string) *Qs {
|
|
q.m[key] = value
|
|
return q
|
|
}
|
|
|
|
func (q *Qs) Remove(key string) *Qs {
|
|
delete(q.m, key)
|
|
return q
|
|
}
|
|
|
|
func (q *Qs) ToString() string {
|
|
builder := strings.Builder{}
|
|
index := 0
|
|
for k, v := range q.m {
|
|
builder.WriteString(k)
|
|
builder.WriteString("=")
|
|
builder.WriteString(v)
|
|
if index < len(q.m)-1 {
|
|
builder.WriteString("&")
|
|
}
|
|
index++
|
|
}
|
|
return builder.String()
|
|
}
|
|
|
|
func GetQueryParam(ctx *RequestContext, key string) string {
|
|
value, ok := ctx.Request.URL.Query()[key]
|
|
if value == nil || !ok {
|
|
current := ctx.currentBrowserUrl
|
|
if current != "" {
|
|
u, err := url.Parse(current)
|
|
if err == nil {
|
|
return u.Query().Get(key)
|
|
}
|
|
}
|
|
}
|
|
if len(value) == 0 {
|
|
return ""
|
|
}
|
|
return value[0]
|
|
}
|
|
|
|
func SetQueryParams(href string, qs *Qs) string {
|
|
u, err := url.Parse(href)
|
|
if err != nil {
|
|
return href
|
|
}
|
|
q := u.Query()
|
|
for key, value := range qs.m {
|
|
if value == "" {
|
|
q.Del(key)
|
|
} else {
|
|
q.Set(key, value)
|
|
}
|
|
}
|
|
u.RawQuery = q.Encode()
|
|
return u.String()
|
|
}
|