51 lines
1.0 KiB
Go
51 lines
1.0 KiB
Go
package hcloud
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
|
|
"k8s.io/autoscaler/cluster-autoscaler/cloudprovider/hetzner/hcloud-go/hcloud/schema"
|
|
)
|
|
|
|
func wrapParseHandler(wrapped handler) handler {
|
|
return &parseHandler{wrapped}
|
|
}
|
|
|
|
type parseHandler struct {
|
|
handler handler
|
|
}
|
|
|
|
func (h *parseHandler) Do(req *http.Request, v any) (resp *Response, err error) {
|
|
// respBody is not needed down the handler chain
|
|
resp, err = h.handler.Do(req, nil)
|
|
if err != nil {
|
|
return resp, err
|
|
}
|
|
|
|
if resp.hasJSONBody() {
|
|
// Parse the response meta
|
|
var s schema.MetaResponse
|
|
if err := json.Unmarshal(resp.body, &s); err != nil {
|
|
return resp, fmt.Errorf("hcloud: error reading response meta data: %w", err)
|
|
}
|
|
if s.Meta.Pagination != nil {
|
|
p := PaginationFromSchema(*s.Meta.Pagination)
|
|
resp.Meta.Pagination = &p
|
|
}
|
|
}
|
|
|
|
// Parse the response schema
|
|
if v != nil {
|
|
if w, ok := v.(io.Writer); ok {
|
|
_, err = io.Copy(w, bytes.NewReader(resp.body))
|
|
} else {
|
|
err = json.Unmarshal(resp.body, v)
|
|
}
|
|
}
|
|
|
|
return resp, err
|
|
}
|