github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/helper/http.go (about) 1 package helper 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "io" 7 "net/http" 8 "strings" 9 ) 10 11 func HttpGetWithBasicAuth(url, user, password string) (int, []byte, error) { 12 return HttpDoWithBasicAuth("GET", url, user, password, nil) 13 } 14 15 func HttpPostWithBasicAuth(url, user, password string) (int, []byte, error) { 16 return HttpDoWithBasicAuth("POST", url, user, password, nil) 17 } 18 19 func HttpPostInputWithBasicAuth(url, user, password string, input io.Reader) (int, []byte, error) { 20 return HttpDoWithBasicAuth("POST", url, user, password, input) 21 } 22 23 func HttpDoWithBasicAuth(method, url, user, password string, input io.Reader) (int, []byte, error) { 24 req, err := http.NewRequest(method, url, input) 25 if err != nil { 26 return 0, nil, err 27 } 28 if input != nil { 29 req.Header.Set("Content-Type", "application/json; charset=UTF-8") 30 } 31 32 req.SetBasicAuth(user, password) 33 httpClient := &http.Client{} 34 resp, err := httpClient.Do(req) 35 if err != nil { 36 return 0, nil, err 37 } 38 if !Is2xx(resp.StatusCode) { 39 return resp.StatusCode, nil, fmt.Errorf("failed to get resources %s, status code %d", url, resp.StatusCode) 40 } 41 defer resp.Body.Close() 42 43 body, err := io.ReadAll(resp.Body) 44 if err != nil { 45 return resp.StatusCode, nil, err 46 } 47 48 return resp.StatusCode, body, nil 49 } 50 51 func HttpGet(url string) (int, []byte, error) { 52 resp, err := HttpGetWrapper(url) 53 if err != nil { 54 return 0, nil, err 55 } 56 if !Is2xx(resp.StatusCode) { 57 return resp.StatusCode, nil, fmt.Errorf("failed to get resource %s, status code %d", url, resp.StatusCode) 58 } 59 defer resp.Body.Close() 60 61 body, err := io.ReadAll(resp.Body) 62 if err != nil { 63 return resp.StatusCode, nil, err 64 } 65 66 return resp.StatusCode, body, nil 67 } 68 69 func HttpEtag(url string) (int, string, error) { 70 resolvedUrl, resolved := ResolveUrl(url) 71 if resolved { 72 http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} 73 } 74 75 resp, err := http.Head(resolvedUrl) 76 if err != nil { 77 return 0, "", err 78 } 79 80 if !Is2xx(resp.StatusCode) { 81 return resp.StatusCode, "", fmt.Errorf("failed to read etage from %s, status code %d", url, resp.StatusCode) 82 } 83 84 return resp.StatusCode, strings.Trim(resp.Header.Get("etag"), "\""), nil 85 } 86 87 func HttpGetWrapper(url string) (*http.Response, error) { 88 resolvedUrl, resolved := ResolveUrl(url) 89 if resolved { 90 http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} 91 } 92 return http.Get(resolvedUrl) 93 } 94 95 func HttpNewRequestWrapper(method, url string, body io.Reader) (*http.Request, error) { 96 resolvedUrl, resolved := ResolveUrl(url) 97 if resolved { 98 http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} 99 } 100 return http.NewRequest(method, resolvedUrl, body) 101 } 102 103 func ResolveUrl(url string) (string, bool) { 104 return url, false 105 } 106 107 func BodyAsString(resp *http.Response) (string, error) { 108 defer resp.Body.Close() 109 body, err := io.ReadAll(resp.Body) 110 if err != nil { 111 return "", err 112 } 113 114 return string(body), nil 115 }