blob: 7c762d99e8d5fa36748a8bd3eb9232f87c763c2f [file] [log] [blame]
elinuxhenrikcce95ff2021-09-05 17:27:02 +02001// -
2// ========================LICENSE_START=================================
3// O-RAN-SC
4// %%
5// Copyright (C) 2021: Nordix Foundation
6// %%
7// Licensed under the Apache License, Version 2.0 (the "License");
8// you may not use this file except in compliance with the License.
9// You may obtain a copy of the License at
10//
11// http://www.apache.org/licenses/LICENSE-2.0
12//
13// Unless required by applicable law or agreed to in writing, software
14// distributed under the License is distributed on an "AS IS" BASIS,
15// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16// See the License for the specific language governing permissions and
17// limitations under the License.
18// ========================LICENSE_END===================================
19//
20
21package restclient
22
23import (
24 "bytes"
25 "fmt"
26 "io"
27 "net/http"
28)
29
30// HTTPClient interface
31type HTTPClient interface {
32 Get(url string) (*http.Response, error)
33
34 Do(*http.Request) (*http.Response, error)
35}
36
37type RequestError struct {
38 StatusCode int
39 Body []byte
40}
41
42func (pe RequestError) Error() string {
43 return fmt.Sprintf("Request failed due to error response with status: %v and body: %v", pe.StatusCode, string(pe.Body))
44}
45
elinuxhenrik65a53d22021-09-29 15:41:26 +020046func Get(url string, client HTTPClient) ([]byte, error) {
47 if response, err := client.Get(url); err == nil {
48 if isResponseSuccess(response.StatusCode) {
49 defer response.Body.Close()
50 if responseData, err := io.ReadAll(response.Body); err == nil {
elinuxhenrikcce95ff2021-09-05 17:27:02 +020051 return responseData, nil
52 } else {
elinuxhenrik65a53d22021-09-29 15:41:26 +020053 return nil, err
elinuxhenrikcce95ff2021-09-05 17:27:02 +020054 }
55 } else {
elinuxhenrik65a53d22021-09-29 15:41:26 +020056 return nil, getRequestError(response)
elinuxhenrikcce95ff2021-09-05 17:27:02 +020057 }
58 } else {
59 return nil, err
60 }
61}
62
elinuxhenrik65a53d22021-09-29 15:41:26 +020063func Put(url string, body []byte, client HTTPClient) error {
64 return do(http.MethodPut, url, body, client)
elinuxhenrik28038562021-09-21 15:43:11 +020065}
66
elinuxhenrik65a53d22021-09-29 15:41:26 +020067func Post(url string, body []byte, client HTTPClient) error {
68 return do(http.MethodPost, url, body, client)
elinuxhenrik28038562021-09-21 15:43:11 +020069}
70
elinuxhenrik65a53d22021-09-29 15:41:26 +020071func do(method string, url string, body []byte, client HTTPClient) error {
elinuxhenrik28038562021-09-21 15:43:11 +020072 if req, reqErr := http.NewRequest(method, url, bytes.NewBuffer(body)); reqErr == nil {
elinuxhenrikc4960f12021-10-28 16:27:57 +020073 req.Header.Set("Content-Type", "application/json")
elinuxhenrik65a53d22021-09-29 15:41:26 +020074 if response, respErr := client.Do(req); respErr == nil {
elinuxhenrikcce95ff2021-09-05 17:27:02 +020075 if isResponseSuccess(response.StatusCode) {
76 return nil
77 } else {
78 return getRequestError(response)
79 }
80 } else {
81 return respErr
82 }
83 } else {
84 return reqErr
85 }
86}
87
88func isResponseSuccess(statusCode int) bool {
89 return statusCode >= http.StatusOK && statusCode <= 299
90}
91
92func getRequestError(response *http.Response) RequestError {
elinuxhenrikb1fb1d82021-09-07 02:58:52 +020093 defer response.Body.Close()
elinuxhenrikcce95ff2021-09-05 17:27:02 +020094 responseData, _ := io.ReadAll(response.Body)
95 putError := RequestError{
96 StatusCode: response.StatusCode,
97 Body: responseData,
98 }
99 return putError
100}