github.com/micro/go-micro/v2@v2.9.1/util/kubernetes/api/response.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"net/http"
     9  )
    10  
    11  // Errors ...
    12  var (
    13  	ErrNotFound = errors.New("kubernetes: resource not found")
    14  	ErrDecode   = errors.New("kubernetes: error decoding")
    15  	ErrUnknown  = errors.New("kubernetes: unknown error")
    16  )
    17  
    18  // Status is an object that is returned when a request
    19  // failed or delete succeeded.
    20  type Status struct {
    21  	Kind    string `json:"kind"`
    22  	Status  string `json:"status"`
    23  	Message string `json:"message"`
    24  	Reason  string `json:"reason"`
    25  	Code    int    `json:"code"`
    26  }
    27  
    28  // Response ...
    29  type Response struct {
    30  	res *http.Response
    31  	err error
    32  
    33  	body []byte
    34  }
    35  
    36  // Error returns an error
    37  func (r *Response) Error() error {
    38  	return r.err
    39  }
    40  
    41  // StatusCode returns status code for response
    42  func (r *Response) StatusCode() int {
    43  	return r.res.StatusCode
    44  }
    45  
    46  // Into decode body into `data`
    47  func (r *Response) Into(data interface{}) error {
    48  	if r.err != nil {
    49  		return r.err
    50  	}
    51  
    52  	defer r.res.Body.Close()
    53  	decoder := json.NewDecoder(r.res.Body)
    54  	if err := decoder.Decode(&data); err != nil {
    55  		return fmt.Errorf("%v: %v", ErrDecode, err)
    56  	}
    57  
    58  	return r.err
    59  }
    60  
    61  func (r *Response) Close() error {
    62  	return r.res.Body.Close()
    63  }
    64  
    65  func newResponse(res *http.Response, err error) *Response {
    66  	r := &Response{
    67  		res: res,
    68  		err: err,
    69  	}
    70  
    71  	if err != nil {
    72  		return r
    73  	}
    74  
    75  	if r.res.StatusCode == http.StatusOK ||
    76  		r.res.StatusCode == http.StatusCreated ||
    77  		r.res.StatusCode == http.StatusNoContent {
    78  		// Non error status code
    79  		return r
    80  	}
    81  
    82  	if r.res.StatusCode == http.StatusNotFound {
    83  		r.err = ErrNotFound
    84  		return r
    85  	}
    86  
    87  	b, err := ioutil.ReadAll(r.res.Body)
    88  	if err == nil {
    89  		r.err = errors.New(string(b))
    90  		return r
    91  	}
    92  
    93  	r.err = ErrUnknown
    94  
    95  	return r
    96  }