gitee.com/sasukebo/go-micro/v4@v4.7.1/util/kubernetes/api/response.go (about) 1 package api 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "io" 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 if r.res != nil { 63 return r.res.Body.Close() 64 } 65 return nil 66 } 67 68 func newResponse(res *http.Response, err error) *Response { 69 r := &Response{ 70 res: res, 71 err: err, 72 } 73 74 if err != nil { 75 return r 76 } 77 78 if r.res.StatusCode == http.StatusOK || 79 r.res.StatusCode == http.StatusCreated || 80 r.res.StatusCode == http.StatusNoContent { 81 // Non error status code 82 return r 83 } 84 85 if r.res.StatusCode == http.StatusNotFound { 86 r.err = ErrNotFound 87 return r 88 } 89 90 b, err := io.ReadAll(r.res.Body) 91 if err == nil { 92 r.err = errors.New(string(b)) 93 return r 94 } 95 96 r.err = ErrUnknown 97 98 return r 99 }