diff --git a/CHANGELOG.md b/CHANGELOG.md index ab80af3..5ff13fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,4 @@ -## Version 1.6.8 - -## Feature -- Add IDs() methods returning array of uint64 IDs for all List* structs in cloudapi/cloudbroker groups +## Version 1.6.10 ## Bugfix -- Fix field Audit in CloudBrokerEndpoints model in cloudbroker/apiaccess +- Fix panic for nil pointer response reference in client and legacy-client \ No newline at end of file diff --git a/client.go b/client.go index 6866709..53e3b4e 100644 --- a/client.go +++ b/client.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "crypto/tls" - "errors" "fmt" "io" "mime/multipart" @@ -97,22 +96,11 @@ func (dc *DecortClient) DecortApiCall(ctx context.Context, method, url string, p return nil, err } - resp, err := dc.do(req, ctype) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - respBytes, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - if resp.StatusCode != 200 { - return nil, errors.New(string(respBytes)) - } + // perform request + var respBytes []byte + respBytes, err = dc.do(req, ctype) - return respBytes, nil + return respBytes, err } func (dc *DecortClient) getToken(ctx context.Context) error { @@ -149,7 +137,7 @@ func (dc *DecortClient) getToken(ctx context.Context) error { return nil } -func (dc *DecortClient) do(req *http.Request, ctype string) (*http.Response, error) { +func (dc *DecortClient) do(req *http.Request, ctype string) ([]byte, error) { if ctype != "" { req.Header.Add("Content-Type", ctype) } else { @@ -159,31 +147,34 @@ func (dc *DecortClient) do(req *http.Request, ctype string) (*http.Response, err req.Header.Add("Authorization", "bearer "+dc.cfg.Token) req.Header.Set("Accept", "application/json") - // var resp *http.Response - // var err error - buf, _ := io.ReadAll(req.Body) - // req = req.Clone(req.Context()) + buf, err := io.ReadAll(req.Body) + if err != nil { + return nil, err + } - // for i := uint64(0); i < dc.cfg.Retries; i++ { req.Body = io.NopCloser(bytes.NewBuffer(buf)) - resp, err := dc.client.Do(req) - // if err == nil { - if resp.StatusCode == 200 { - return resp, err + resp, err := dc.client.Do(req) + if err != nil || resp == nil { + return nil, err } + defer resp.Body.Close() + + // handle successful request respBytes, _ := io.ReadAll(resp.Body) - err = fmt.Errorf("%s", respBytes) - resp.Body.Close() - // } - // } + if resp.StatusCode == 200 { + return respBytes, nil + } + // handle errors with status code other than 200 + err = fmt.Errorf("%s", respBytes) return nil, fmt.Errorf("could not execute request: %w", err) } func createK8sCloudApi(req k8s_ca.CreateRequest) (*bytes.Buffer, string) { reqBody := &bytes.Buffer{} writer := multipart.NewWriter(reqBody) + defer writer.Close() if req.OidcCertificate != "" { part, _ := writer.CreateFormFile("oidcCertificate", "ca.crt") _, _ = io.Copy(part, strings.NewReader(req.OidcCertificate)) @@ -290,14 +281,13 @@ func createK8sCloudApi(req k8s_ca.CreateRequest) (*bytes.Buffer, string) { _ = writer.WriteField("extnetOnly", strconv.FormatBool(req.ExtNetOnly)) ct := writer.FormDataContentType() - writer.Close() - return reqBody, ct } func createK8sCloudBroker(req k8s_cb.CreateRequest) (*bytes.Buffer, string) { reqBody := &bytes.Buffer{} writer := multipart.NewWriter(reqBody) + defer writer.Close() if req.OidcCertificate != "" { part, _ := writer.CreateFormFile("oidcCertificate", "ca.crt") _, _ = io.Copy(part, strings.NewReader(req.OidcCertificate)) @@ -402,9 +392,7 @@ func createK8sCloudBroker(req k8s_cb.CreateRequest) (*bytes.Buffer, string) { } _ = writer.WriteField("extnetOnly", strconv.FormatBool(req.ExtNetOnly)) - - ct := writer.FormDataContentType() - writer.Close() + ct := writer.FormDataContentType() return reqBody, ct } diff --git a/legacy-client.go b/legacy-client.go index df408b4..20795ff 100644 --- a/legacy-client.go +++ b/legacy-client.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "crypto/tls" - "errors" "fmt" "io" "mime/multipart" @@ -78,7 +77,7 @@ func (ldc *LegacyDecortClient) DecortApiCall(ctx context.Context, method, url st k8sCaCreateReq, okCa := params.(k8s_ca.CreateRequest) k8sCbCreateReq, okCb := params.(k8s_cb.CreateRequest) - + var body *bytes.Buffer var ctype string @@ -93,28 +92,17 @@ func (ldc *LegacyDecortClient) DecortApiCall(ctx context.Context, method, url st } body = bytes.NewBufferString(values.Encode() + fmt.Sprintf("&authkey=%s", ldc.cfg.Token)) } - - req, err := http.NewRequestWithContext(ctx, method, ldc.decortURL+"/restmachine"+url, body) - if err != nil { - return nil, err - } - resp, err := ldc.do(req, ctype) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - respBytes, err := io.ReadAll(resp.Body) + req, err := http.NewRequestWithContext(ctx, method, ldc.decortURL+"/restmachine"+url, body) if err != nil { return nil, err } - if resp.StatusCode != 200 { - return nil, errors.New(string(respBytes)) - } + // perform request + var respBytes []byte + respBytes, err = ldc.do(req, ctype) - return respBytes, nil + return respBytes, err } func (ldc *LegacyDecortClient) getToken(ctx context.Context) error { @@ -148,7 +136,7 @@ func (ldc *LegacyDecortClient) getToken(ctx context.Context) error { return nil } -func (ldc *LegacyDecortClient) do(req *http.Request, ctype string) (*http.Response, error) { +func (ldc *LegacyDecortClient) do(req *http.Request, ctype string) ([]byte, error) { if ctype != "" { req.Header.Add("Content-Type", ctype) } else { @@ -156,32 +144,38 @@ func (ldc *LegacyDecortClient) do(req *http.Request, ctype string) (*http.Respon } req.Header.Set("Accept", "application/json") - // var resp *http.Response - // var err error - buf, _ := io.ReadAll(req.Body) - // req = req.Clone(req.Context()) - - // for i := uint64(0); i < ldc.cfg.Retries; i++ { - + buf, err := io.ReadAll(req.Body) + if err != nil { + return nil, err + } + req.Body.Close() req.Body = io.NopCloser(bytes.NewBuffer(buf)) + resp, err := ldc.client.Do(req) + if err != nil || resp == nil { + return nil, err + } + defer resp.Body.Close() + - // if err == nil { + // handle successful request + respBytes, err := io.ReadAll(resp.Body) + if err!= nil { + return nil, err + } if resp.StatusCode == 200 { - return resp, err + return respBytes, nil } - respBytes, _ := io.ReadAll(resp.Body) - err = fmt.Errorf("%s", respBytes) - resp.Body.Close() - // } - // } + // handle errors with status code other than 200 + err = fmt.Errorf("%s", respBytes) return nil, fmt.Errorf("could not execute request: %w", err) } func createK8sCloudApiLegacy(req k8s_ca.CreateRequest, token string) (*bytes.Buffer, string) { reqBody := &bytes.Buffer{} writer := multipart.NewWriter(reqBody) + defer writer.Close() if req.OidcCertificate != "" { part, _ := writer.CreateFormFile("oidcCertificate", "ca.crt") _, _ = io.Copy(part, strings.NewReader(req.OidcCertificate)) @@ -290,14 +284,13 @@ func createK8sCloudApiLegacy(req k8s_ca.CreateRequest, token string) (*bytes.Buf _ = writer.WriteField("authkey", token) ct := writer.FormDataContentType() - writer.Close() - return reqBody, ct } func createK8sCloudBrokerLegacy(req k8s_cb.CreateRequest, token string) (*bytes.Buffer, string) { reqBody := &bytes.Buffer{} writer := multipart.NewWriter(reqBody) + defer writer.Close() if req.OidcCertificate != "" { part, _ := writer.CreateFormFile("oidcCertificate", "ca.crt") _, _ = io.Copy(part, strings.NewReader(req.OidcCertificate)) @@ -402,11 +395,9 @@ func createK8sCloudBrokerLegacy(req k8s_cb.CreateRequest, token string) (*bytes. } _ = writer.WriteField("extnetOnly", strconv.FormatBool(req.ExtNetOnly)) - + _ = writer.WriteField("authkey", token) ct := writer.FormDataContentType() - - writer.Close() return reqBody, ct }