Initial 2024-01-26
This commit is contained in:
196
cmpSnipper/cmpSnippetHttpCli.go
Normal file
196
cmpSnipper/cmpSnippetHttpCli.go
Normal file
@@ -0,0 +1,196 @@
|
||||
|
||||
package cmpSnipper
|
||||
|
||||
import (
|
||||
// "crypto/md5"
|
||||
"net/http"
|
||||
// "os"
|
||||
"io"
|
||||
// "fmt"
|
||||
"bufio"
|
||||
// "io/ioutil"
|
||||
"bytes"
|
||||
"strings"
|
||||
// "golang.org/x/net/html"
|
||||
// "net/url"
|
||||
"encoding/json"
|
||||
"compress/gzip"
|
||||
"compress/flate"
|
||||
"github.com/andybalholm/brotli"
|
||||
)
|
||||
|
||||
func (app *App) HttpGet(url string) (map[string]interface{}) {
|
||||
ret := map[string]interface{}{
|
||||
"Error" : nil ,
|
||||
"RequestUrl" : url ,
|
||||
"StatusCode" : 0 ,
|
||||
"ContentRaw" : nil ,
|
||||
"ContentJson" : nil ,
|
||||
"Header" : nil ,
|
||||
"Content-Encoding" : "" ,
|
||||
"Content-Type" : "" ,
|
||||
"Content-Length" : "" ,
|
||||
}
|
||||
|
||||
app.Log(url)
|
||||
|
||||
cli := &http.Client{}
|
||||
|
||||
ifcRawHead, err := app.ConfGetIfc("httpTest", "head")
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
mapIfcHead := ifcRawHead.(map[string]interface{})
|
||||
|
||||
mapStrHead := make(map[string][]string)
|
||||
|
||||
for key, val := range mapIfcHead {
|
||||
mapStrHead[key] = []string{ val.(string) }
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
|
||||
req.Header = mapStrHead
|
||||
|
||||
res, err := cli.Do(req)
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
ret["StatusCode" ] = res.StatusCode
|
||||
ret["Content-Length"] = res.ContentLength
|
||||
ret["Header" ] = res.Header
|
||||
|
||||
// app.Log("Response status: %s", res.Status)
|
||||
// app.Log("Header: %+v", res.Header)
|
||||
|
||||
// app.Log("TransferEncoding: %+v", res.TransferEncoding)
|
||||
// app.Log("ContentLength: %+v", res.ContentLength)
|
||||
|
||||
var tmpl []string
|
||||
|
||||
tmpl = res.Header["Content-Encoding"]
|
||||
if len(tmpl) > 0 {
|
||||
ret["Content-Encoding"] = tmpl[0]
|
||||
}
|
||||
|
||||
tmpl = res.Header["Content-Type"]
|
||||
if len(tmpl) > 0 {
|
||||
tmpl = strings.Split(tmpl[0], ";")
|
||||
|
||||
if len(tmpl) > 0 {
|
||||
ret["Content-Type"] = tmpl[0]
|
||||
}
|
||||
}
|
||||
|
||||
// Content-Disposition: attachment; name="fieldName"; filename="myfile.txt"
|
||||
|
||||
|
||||
out := new(bytes.Buffer)
|
||||
var encReader io.Reader
|
||||
|
||||
switch ret["Content-Encoding"] {
|
||||
case "":
|
||||
encReader = bufio.NewReader(res.Body)
|
||||
case "br":
|
||||
encReader = brotli.NewReader(res.Body)
|
||||
case "gzip":
|
||||
encReader, err = gzip.NewReader(res.Body)
|
||||
case "deflate":
|
||||
encReader = flate.NewReader(res.Body)
|
||||
default:
|
||||
app.Log("Unknown Content-Encoding %s", ret["Content-Encoding"])
|
||||
encReader = bufio.NewReader(res.Body)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
size, err := out.ReadFrom(encReader)
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
app.Log("Read %s", size)
|
||||
|
||||
var contRaw []byte = out.Bytes()
|
||||
ret["ContentRaw"] = contRaw
|
||||
|
||||
if ret["Content-Type"] == "application/json" {
|
||||
var contJson interface{}
|
||||
|
||||
err = json.Unmarshal(contRaw, &contJson)
|
||||
|
||||
if err != nil {
|
||||
app.Log(err)
|
||||
ret["Error"] = err
|
||||
return ret
|
||||
}
|
||||
|
||||
ret["ContentJson"] = contJson
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (app *App) CmpHttpTestSnip(parm any) (any, error) {
|
||||
var err error
|
||||
|
||||
cli, err := app.SnipGetCli(parm)
|
||||
|
||||
if err != nil {
|
||||
return map[string]interface{}{
|
||||
"status": "error",
|
||||
"error" : "Not client found",
|
||||
}, err
|
||||
}
|
||||
|
||||
url, err := app.ConfGetStr("httpTest", "url")
|
||||
|
||||
if err != nil {
|
||||
return map[string]interface{}{
|
||||
"status": "error",
|
||||
"error" : "Not test URL",
|
||||
}, err
|
||||
}
|
||||
|
||||
go func() {
|
||||
var a map[string]interface{}
|
||||
|
||||
a = app.HttpGet(url)
|
||||
|
||||
app.Log(a)
|
||||
|
||||
app.HttpWebSockSendTo(cli, "cmpHttpTest", map[string]interface{}{
|
||||
"status" : "response",
|
||||
"response": a,
|
||||
})
|
||||
}()
|
||||
|
||||
|
||||
return map[string]interface{}{
|
||||
"status" : "request",
|
||||
"request": url,
|
||||
}, nil
|
||||
}
|
Reference in New Issue
Block a user