diff --git a/frontend/ghost/client.go b/frontend/ghost/client.go index cc99485..a789dd5 100644 --- a/frontend/ghost/client.go +++ b/frontend/ghost/client.go @@ -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 +} \ No newline at end of file diff --git a/go.mod b/go.mod index aacb4ed..64260c9 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.17 require ( github.com/jackwhelpton/fasthttp-routing/v2 v2.0.0 + github.com/mailru/easyjson v0.7.7 github.com/sirupsen/logrus v1.8.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.9.0