gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/runtime/kubernetes/client/api/response.go (about)

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