68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
// 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
|
|
}
|
|
}
|