comandy/http.go

110 lines
2.4 KiB
Go
Raw Normal View History

2024-04-15 17:10:06 +09:00
package main
import (
"encoding/base64"
"encoding/json"
2024-04-15 23:58:32 +09:00
"fmt"
"io"
2024-04-15 17:10:06 +09:00
"net/http"
2024-04-15 23:58:32 +09:00
"reflect"
2024-04-15 17:10:06 +09:00
"strings"
2024-04-19 00:20:03 +09:00
"github.com/fumiama/terasu/http2"
2024-04-15 17:10:06 +09:00
)
type capsule struct {
C int `json:"code,omitempty"`
M string `json:"method,omitempty"`
U string `json:"url,omitempty"`
H map[string]any `json:"headers,omitempty"`
D string `json:"data,omitempty"`
}
func (r *capsule) printerr(err error) string {
buf := strings.Builder{}
r.C = http.StatusInternalServerError
r.D = base64.StdEncoding.EncodeToString(stringToBytes(err.Error()))
_ = json.NewEncoder(&buf).Encode(r)
return buf.String()
}
func (r *capsule) printstrerr(err string) string {
buf := strings.Builder{}
r.C = http.StatusInternalServerError
r.D = base64.StdEncoding.EncodeToString(stringToBytes(err))
_ = json.NewEncoder(&buf).Encode(r)
return buf.String()
}
2024-04-15 23:58:32 +09:00
2024-04-19 00:20:03 +09:00
func gorequest(para string) (ret string) {
2024-04-15 23:58:32 +09:00
r := capsule{}
2024-04-16 15:27:06 +09:00
defer func() {
err := recover()
if err != nil {
ret = r.printstrerr(fmt.Sprint())
}
}()
2024-04-15 23:58:32 +09:00
err := json.Unmarshal(stringToBytes(para), &r)
if err != nil {
return r.printerr(err)
}
if r.U == "" || !strings.HasPrefix(r.U, "https://") {
return r.printstrerr("invalid url '" + r.U + "'")
}
if r.M != "GET" && r.M != "POST" && r.M != "DELETE" {
return r.printstrerr("invalid method '" + r.U + "'")
}
var body io.Reader
if len(r.D) > 0 {
body = strings.NewReader(r.D)
}
req, err := http.NewRequest(r.M, r.U, body)
if err != nil {
return r.printerr(err)
}
for k, vs := range r.H {
lk := strings.ToLower(k)
if strings.HasPrefix(lk, "x-") {
continue
}
switch x := vs.(type) {
case string:
req.Header.Add(k, x)
case []string:
for _, v := range x {
req.Header.Add(k, v)
}
default:
return r.printstrerr("unsupported H type " + reflect.ValueOf(x).Type().Name())
}
}
2024-04-19 00:20:03 +09:00
resp, err := http2.DefaultClient.Do(req)
2024-04-15 23:58:32 +09:00
if err != nil {
return r.printerr(err)
}
defer resp.Body.Close()
sb := strings.Builder{}
enc := base64.NewEncoder(base64.StdEncoding, &sb)
_, err = io.Copy(enc, resp.Body)
_ = enc.Close()
if err != nil {
return r.printerr(err)
}
r.C = resp.StatusCode
r.H = make(map[string]any, len(resp.Header)*2)
for k, vs := range resp.Header {
if len(vs) == 1 {
r.H[k] = vs[0]
continue
}
r.H[k] = vs
}
r.D = sb.String()
outbuf := strings.Builder{}
err = json.NewEncoder(&outbuf).Encode(&r)
if err != nil {
return r.printerr(err)
}
return outbuf.String()
}