// Copyright (C) 2020 Marius Schellenberger package pve import ( "bytes" "encoding/json" "errors" "io" "net/http" "net/url" "strings" ) type data struct { Data json.RawMessage `json:"data"` Errors json.RawMessage `json:"errors"` } func unwrapData(resp *http.Response, v interface{}) error { if resp.Body == nil { return nil } var d data err := json.NewDecoder(resp.Body).Decode(&d) if err != nil { return err } if d.Errors != nil { return errors.New(string(d.Errors)) } if v == nil { return nil } return json.Unmarshal(d.Data, &v) } type httpbody map[string]string func (b httpbody) Reader() io.Reader { data := url.Values{} for k, v := range b { data.Set(k, v) } return strings.NewReader(data.Encode()) } type unreadBuffer struct { b *bytes.Buffer save []byte } func newUnreadBuffer() (ub *unreadBuffer, buf *bytes.Buffer) { buf = new(bytes.Buffer) ub = &unreadBuffer{b: buf} return } func (u *unreadBuffer) Save() { u.save = u.b.Bytes() } func (u *unreadBuffer) Reset(b **bytes.Buffer) { if u.save != nil && b != nil { u.b = bytes.NewBuffer(u.save) *b = u.b } }