56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
package sdk
|
|
|
|
import (
|
|
"context"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
xml "git.pyer.club/kingecg/goxml"
|
|
|
|
"github.com/beevik/etree"
|
|
"github.com/juju/errors"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
var (
|
|
// LoggerContext is the builder of a zerolog.Logger that is exposed to the application so that
|
|
// options at the CLI might alter the formatting and the output of the logs.
|
|
LoggerContext = zerolog.
|
|
New(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}).
|
|
With().Timestamp()
|
|
|
|
// Logger is a zerolog logger, that can be safely used from any part of the application.
|
|
// It gathers the format and the output.
|
|
Logger = LoggerContext.Logger()
|
|
)
|
|
|
|
func ReadAndParse(ctx context.Context, httpReply *http.Response, reply interface{}, tag string) error {
|
|
Logger.Debug().
|
|
Str("msg", httpReply.Status).
|
|
Int("status", httpReply.StatusCode).
|
|
Str("action", tag).
|
|
Msg("RPC")
|
|
|
|
// TODO(jfsmig): extract the deadline from ctx.Deadline() and apply it on the reply reading
|
|
if b, err := ioutil.ReadAll(httpReply.Body); err != nil {
|
|
return errors.Annotate(err, "read")
|
|
} else {
|
|
|
|
if httpReply.StatusCode != http.StatusOK || os.Getenv("DEBUG") == "DEBUG" {
|
|
doc := etree.NewDocument()
|
|
doc.ReadFromBytes(b)
|
|
doc.Indent(2)
|
|
xmlstr, _ := doc.WriteToString()
|
|
if httpReply.StatusCode != http.StatusOK {
|
|
Logger.Error().Str("msg", xmlstr).Msg("XMLDOC")
|
|
return errors.New("unexpected status code")
|
|
}
|
|
|
|
}
|
|
err = xml.Unmarshal(b, reply)
|
|
return errors.Annotate(err, "decode")
|
|
}
|
|
}
|