Files
2026-09-21 16:46:55 +08:00

64 lines
1.2 KiB
Go

package navicat
import (
"encoding/base64"
"net/url"
"strconv"
"strings"
)
// Request is one Navicat HTTP Tunnel POST body.
type Request struct {
Action string
Host string
Port int
Login string
Password string
Database string
Queries []string
EncodeBase64 bool
}
// Form builds application/x-www-form-urlencoded fields matching $_POST in ntunnel_mysql.php.
func (r Request) Form() url.Values {
v := url.Values{}
v.Set("actn", r.Action)
v.Set("host", r.Host)
if r.Port > 0 {
v.Set("port", strconv.Itoa(r.Port))
} else {
v.Set("port", "")
}
v.Set("login", r.Login)
v.Set("password", r.Password)
v.Set("db", r.Database)
queries := nonEmpty(r.Queries)
if r.EncodeBase64 {
v.Set("encodeBase64", "1")
for _, q := range queries {
v.Add("q[]", base64.StdEncoding.EncodeToString([]byte(q)))
}
} else {
for _, q := range queries {
v.Add("q[]", q)
}
}
return v
}
func (r Request) Encode() string {
return r.Form().Encode()
}
func nonEmpty(in []string) []string {
out := make([]string, 0, len(in))
for _, s := range in {
if strings.TrimSpace(s) == "" {
continue
}
out = append(out, s)
}
return out
}