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 }