Implement generic http query

This commit is contained in:
2021-12-03 03:50:34 +01:00
parent e3c87d5eff
commit 29124c0490
2 changed files with 52 additions and 0 deletions
+51
View File
@@ -1,8 +1,11 @@
package ghost
import (
"fmt"
"sync"
"time"
"github.com/mailru/easyjson"
"github.com/valyala/fasthttp"
)
// Ghost content data URIs:
@@ -18,6 +21,8 @@ type HTTPClient struct {
Secured bool
client *fasthttp.HostClient
setupClientOnce sync.Once
}
// setupClient creates the default http client
@@ -31,3 +36,49 @@ func (g *HTTPClient) setupClient() {
DisablePathNormalizing: true,
}
}
// doQuery does the method and unmarshals the result into the easyjson Unmarshaler
func (g *HTTPClient) doQuery(method string, v easyjson.Unmarshaler, params ...QueryParam) (err error) {
g.setupClientOnce.Do(g.setupClient)
req := fasthttp.AcquireRequest()
res := fasthttp.AcquireResponse()
defer func() {
fasthttp.ReleaseResponse(res)
fasthttp.ReleaseRequest(req)
}()
uri := req.URI()
uri.SetHost(g.Addr)
uri.SetPath(method)
uri.QueryArgs().Add("key", g.ContentKey)
if g.client.IsTLS {
uri.SetScheme("https")
}
for _, param := range params {
param.Apply(&req.Header, uri.QueryArgs())
}
err = g.client.DoTimeout(req, res, g.QueryTimeout)
if err != nil {
return
}
if res.StatusCode() != fasthttp.StatusOK {
return fmt.Errorf("non OK status code: %d", res.StatusCode())
}
resBytes := res.Body()
if resBytes == nil && v == nil {
return fmt.Errorf("nothing to unmarshal")
}
if resBytes == nil {
return
}
err = easyjson.Unmarshal(resBytes, v)
return
}