| @ -0,0 +1,48 @@ | |||||
| # Simple cURL wrapper to manage nicely error handling: | |||||
| # | |||||
| # * In case of success, just read body from stdout | |||||
| # * In case of HTTP error (status >= 400), first stderr contains "HTTP status: XXX", then body | |||||
| # * In case of other error, just print cURL error on stderr | |||||
| # | |||||
| # This function requires a temporary file. It's created under ${TEMP_DIR} if defined and not empty. | |||||
| # Otherwise, it relies on `mktemp` defaults. | |||||
| # | |||||
| curl.do() { | |||||
| local rc=0 | |||||
| local mktemp_opts=( '--suffix=.curl' ) | |||||
| [[ -z "${TEMP_DIR}" ]] || mktemp_opts+=( "--tempdir=${TEMP_DIR}" ) | |||||
| local curl_body_file='' | |||||
| curl_body_file="$(mktemp "${mktemp_opts[@]}")" || { | |||||
| rc=$? | |||||
| echo "Unable to create temporary file for cURL output" | |||||
| return $rc | |||||
| } >&2 | |||||
| local curl_opts=( | |||||
| --output "${curl_body_file}" | |||||
| --write-out '%{http_code}' | |||||
| --silent | |||||
| --show-error | |||||
| "$@" | |||||
| ) | |||||
| local http_code='' | |||||
| http_code="$(curl "${curl_opts[@]}")" || rc=$? | |||||
| (( http_code < 400 )) || { | |||||
| (( rc == 0 )) || rc=1 | |||||
| echo "HTTP status: ${http_code}" | |||||
| } >&2 | |||||
| if [[ $rc == 0 ]]; then | |||||
| cat "${curl_body_file}" || rc=$? | |||||
| else | |||||
| cat "${curl_body_file}" >&2 | |||||
| fi | |||||
| rm -rf "${curl_body_file}" || { | |||||
| (( rc == 0 )) || rc=1 | |||||
| echo "Unable to clear temporary file '${curl_body_file}'" | |||||
| } >&2 | |||||
| return $rc | |||||
| } | |||||