diff --git a/inc/rest-api-client.sh b/inc/rest-api-client.sh index ced0a3446c5564f56d40b733c90c5a1389b6fc3c..ab6e9e48f01647e556889a9301b24caadf06a9be 100644 --- a/inc/rest-api-client.sh +++ b/inc/rest-api-client.sh @@ -8,26 +8,29 @@ # - curl # - sha1sum (optional; for export functionality with AUTOFILE only) # ---------------------------------------------------------------------- +# License: GPL 3.0 +# Source: <https://git-repo.iml.unibe.ch/iml-open-source/bash-rest-api-client> +# Docs: <https://os-docs.iml.unibe.ch/bash-rest-api-client/> +# ---------------------------------------------------------------------- # (1) source this script # (2) enter "http.help" to get a list of available commands # ---------------------------------------------------------------------- # 2020-02-07 v0.2 axel.hahn@iml.unibe.ch BETABETA # 2020-02-12 v0.4 axel.hahn@iml.unibe.ch Caching # 2020-03-02 v0.5 axel.hahn@iml.unibe.ch a few more response check functions +# 2021-01-21 v0.6 axel.hahn@iml.unibe.ch add Content-type in request header +# 2022-01-11 v0.7 axel.hahn@iml.unibe.ch fixes using shellcheck +# 2024-10-09 v0.8 axel.hahn@unibe.ch add setAuthorization; customize accept header, add custom request headers +# 2024-10-10 v0.9 axel.hahn@unibe.ch update docs # ====================================================================== -# --- fetch incoming params - RestApiCfg=$1 - RestApiMethod=$2 - ApiUrl=$3 - Body="$4" - - http_cfg__about="Bash REST API client v0.5" + http_cfg__about="Bash REST API client v0.9" typeset -i http_cfg__debug=0 typeset -i http_cfg__cacheTtl=0 http_cfg__cacheDir=/var/tmp/http-cache http_cfg__UA="${http_cfg__about}" http_cfg__prjurl="https://git-repo.iml.unibe.ch/iml-open-source/bash-rest-api-client" + http_cfg__docsurl="https://os-docs.iml.unibe.ch/bash-rest-api-client/" # --- curl meta infos to collect # see variables in man curl --write-out param @@ -67,10 +70,11 @@ # ...................................................................... # - # write a debug message to STDERR + # Write a debug message to STDERR # Do no not change the prefix - is is read in inc_functions # # params strings output message + # function http._wd(){ if [ $http_cfg__debug -gt 0 ]; then echo -e "\e[33m# RESTAPI::DEBUG $*\e[0m" >&2 @@ -79,10 +83,11 @@ # ...................................................................... # - # write an error message to STDERR + # Write an error message to STDERR # Do no not change the prefix - is is read in inc_functions # # params strings output message + # function http._we(){ echo -e "\e[31m# RESTAPI::ERROR $*\e[0m" >&2 } @@ -101,21 +106,31 @@ EOH # grep "function http.[a-z]" $0 | sort } + # ...................................................................... + # + # Initialize the client + # + # Initialize the client for a new request. Call this before any other + # function. It will reset all variables. + # function http.init(){ - + http._wd "${FUNCNAME[0]}()" which curl >/dev/null || http.quit # request vars http_req__auth= - http_req__auth= + http_req__authorization= + http_req__accept="application/json" + http_req__headers=() + http_req__body= http_req__method=GET http_req__url= http_req__fullurl= http_req__docs= - http_req__dataprefix="RESTAPICLIENTMETADATA_`date +%s`_$$" + http_req__dataprefix="RESTAPICLIENTMETADATA_$(date +%s)_$$" local writevar= for myvar in $curlMeta do @@ -124,7 +139,6 @@ EOH http_curl__writeout="\\n${http_req__dataprefix}${writevar}\\n" # cache - http_req__mode=undefined http_cfg__cacheTtl=0 http_cfg__cacheFile= @@ -135,15 +149,28 @@ EOH chmod 777 ${http_cfg__cacheDir} 2>/dev/null } - # execute the request + # ...................................................................... + # + # Execute the request + # + # param string optional: method; GET|POST|PUT|DELETE|... # param string optional: full url + # param string optional: request body + # + # description: + # + # This function does the following: + # + # 1. Check if to use a cache + # 2. If not cached, make the request + # 3. If cached, use the cached result + # function http.makeRequest(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" # --- handle optional prams if [ $# -ne 0 ]; then - echo $1 | grep "^[A-Z]*$" >/dev/null - if [ $? -eq 0 ]; then + if echo "$1" | grep -q "^[A-Z]*$"; then http.setMethod "$1" shift 1 fi @@ -153,20 +180,19 @@ EOH # test -z "$1" || http.setFullUrl "$1" # --- detect caching - http_req__mode=REQUEST - useCache=0 - makeRequest=1 - if [ $http_cfg__cacheTtl -gt 0 -a "${http_req__method}" = "GET" ]; then + local useCache=0 + local makeRequest=1 + if [ $http_cfg__cacheTtl -gt 0 ] && [ "${http_req__method}" = "GET" ]; then useCache=1 - test -z "${http_cfg__cacheFile}" && http_cfg__cacheFile=`http._genOutfilename "${http_cfg__cacheDir}/AUTOFILE"` + test -z "${http_cfg__cacheFile}" && http_cfg__cacheFile=$(http._genOutfilename "${http_cfg__cacheDir}/AUTOFILE") if [ -f "${http_cfg__cacheFile}" ]; then http.responseImport "${http_cfg__cacheFile}" - typeset -i local iAge=`http.getRequestAge` + local iAge; typeset -i iAge + iAge=$(http.getRequestAge) http._wd "INFO: Age of cache is $iAge sec - vs TTL $http_cfg__cacheTtl sec - file $http_cfg__cacheFile" - if [ $iAge -gt 0 -a $iAge -lt $http_cfg__cacheTtl ]; then + if [ $iAge -gt 0 ] && [ $iAge -lt $http_cfg__cacheTtl ]; then http._wd "INFO: Using cache" makeRequest=0 - http_req__mode=CACHE else http._wd "INFO: Cache file will be updated after making the request" rm -f "${http_cfg__cacheFile}" 2>/dev/null @@ -177,45 +203,54 @@ EOH # --- make the request if [ $makeRequest -eq 1 ]; then - http_req__start=`date +%s` - http._wd "${FUNCNAME[0]}($1) ${http_req__method} ${http_req__fullurl}" - http_resp__all=$( - if [ -z "${http_req__body}" ]; then - curl -k -s \ - -A "${http_cfg__UA}" \ - -w "${http_curl__writeout}" \ - -H 'Accept: application/json' \ - ${http_req__auth} \ - -i "${http_req__fullurl}" \ - -X "${http_req__method}" - else - curl -k -s \ - -A "${http_cfg__UA}" \ - -w "${http_curl__writeout}" \ - -H 'Accept: application/json' \ - ${http_req__auth} \ - -i "${http_req__fullurl}" \ - -X "${http_req__method}" \ - -d "${http_req__body}" - fi - ) || http.quit + + # build curl parameters + local curl_params=( + -k + -s + -i "${http_req__fullurl}" + -X "${http_req__method}" + -w "${http_curl__writeout}" + -A "${http_cfg__UA}" + ) + test -n "$http_req__auth" && curl_params+=( -u "$http_req__auth" ) + test -n "$http_req__authorization" && curl_params+=( -H "Authorization: $http_req__authorization" ) + test -n "$http_req__accept" && curl_params+=( -H "Accept: $http_req__accept" ) + test -n "$http_req__body" && curl_params+=( -d "${http_req__body}" ) + curl_params+=( "${http_req__headers[@]}" ) + + http._wd "${FUNCNAME[0]}($1) ${http_req__method} ${http_req__fullurl}" + http_resp__all=$( curl "${curl_params[@]}") || http.quit + http._wd "OK - Curl finished the http request ... processing data" - http_resp__neutral=`http._fetchAllAndReformat` + http_resp__neutral=$(http._fetchAllAndReformat) if [ $useCache -eq 1 ]; then http._wd "INFO: writing cache ..." http.responseExport "${http_cfg__cacheFile}" fi fi - http._wd "Request function finished; Code `http.getStatuscode`" + http._wd "Request function finished; Code $(http.getStatuscode)" } # ...................................................................... # - # show error message with last return code and quit with this exitcode + # Show error message with last return code and quit with this exitcode + # + # This function is used to quit the script with a meaningful error message + # and the exit code of the last command. + # + # The message is printed to STDERR and contains the return code. + # If a documentation URL is known, it is printed as a hint. + # + # The exit code is the one of the last command. + # To prevent the script from exiting when this function is called from a + # sourced file, the exit is commented out. + # # no params + # function http.quit(){ - http._wd "${FUNCNAME[0]}($1)" rc=$? + http._wd "${FUNCNAME[0]}()" echo >&2 echo -e "\e[31m# ERROR: command FAILED with rc $rc. \e[0m" >&2 if [ ! -z "${RestApiDocs}" ]; then @@ -226,7 +261,26 @@ EOH } - # load a config file + # ...................................................................... + # + # Load a config file + # + # This function is marked as deprecated. + # It will be removed in the future. + # + # param string config file name + # + # Sourcing that file will set the following vars + # - RestApiUser + # - RestApiPassword + # - RestApiBaseUrl + # - RestApiDocs + # + # The function will then set the "internal" vars + # - http_req__auth + # - http_req__fullurl + # - http_req__docs + # function http.loadcfg(){ http._wd "${FUNCNAME[0]}($1) !!! DEPRECATED !!!" # reset expected vars from config @@ -239,7 +293,7 @@ EOH . "${1}" || http.quit # set "internal" vars - if [-z "$RestApiPassword" ]; then + if [ -z "$RestApiPassword" ]; then http.setAuth "$RestApiUser:$RestApiPassword" else http.setAuth @@ -251,6 +305,17 @@ EOH # ====================================================================== # GETTER # ====================================================================== + + # ...................................................................... + # + # Get the response header or response body + # + # param string what to return; one of header|body + # + # Return the response header or the response body. The output is the same + # as that of http.getResponseHeader or http.getResponse. The difference is + # the implementation + # function http._fetchResponseHeaderOrBody(){ http._wd "${FUNCNAME[0]}($1)" local isheader=true @@ -271,25 +336,40 @@ EOH fi done } + + # ...................................................................... + # + # Get the response data + # + # Return the curl meta infos like http_code, http_connect, local_ip, ... + # as key/ value pairs. Each line is a single key value pair. + # + # The data is extracted from the response header. The format is: + # ${http_req__dataprefix}|key|value|key|value|... + # function http._fetchResponseData(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" echo "${http_resp__all}" | sed "s#${http_req__dataprefix}#\n${http_req__dataprefix}#" | grep "${http_req__dataprefix}" | tail -1 | cut -f 2- -d "|" | sed "s#|#\n#g" | grep -v "${http_req__dataprefix}" | while read -r line; do - echo $line + echo "$line" done } + + # ...................................................................... + # + # Generate the dump with request and response function http._fetchAllAndReformat(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" IFS='' line="#------------------------------------------------------------" echo "#_META_|about:$http_cfg__about" - echo "#_META_|host:`hostname -f`" + echo "#_META_|host:$(hostname -f)" echo $line echo "#_REQUEST_|fullurl:$http_req__fullurl" echo "#_REQUEST_|method:$http_req__method" - echo "#_REQUEST_|time:`date`" - echo "#_REQUEST_|timestamp:`date +%s`" - echo "#_REQUEST_|auth:`echo $http_req__auth | sed 's#:.*#:xxxxxxxx#'`" + echo "#_REQUEST_|time:$(date)" + echo "#_REQUEST_|timestamp:$(date +%s)" + echo "#_REQUEST_|auth:$(echo $http_req__auth | sed 's#:.*#:xxxxxxxx#')" echo "#_REQUEST_|body:$http_req__body" echo "#_REQUEST_|baseurl:$http_req__baseurl" echo "#_REQUEST_|url:$http_req__url" @@ -303,6 +383,14 @@ EOH echo $line END } + # ...................................................................... + # + # Get a section from dump data + # + # param string what to return; one of HEADER|DATA|BODY + # + # returns string the requested part of the response + # function http._getFilteredResponse(){ http._wd "${FUNCNAME[0]}($1)" echo "${http_resp__neutral}" | grep "^#_${1}_|" | cut -f 2- -d "|" @@ -310,44 +398,97 @@ EOH # ---------- PUBLIC REQUEST GETTER + # ...................................................................... + # + # Get timestamp of the response as a Unix timestamp. + # + # no param + # + # returns string the timestamp of the response + # function http.getRequestTs(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http._getFilteredResponse REQUEST | grep "^timestamp" | cut -f 2 -d ":" } - # get age of the response in sec. + # ...................................................................... + # + # Get age of the response in sec. # It is especially useful after responseImport + # + # no param + # + # returns integer age of the response in sec + # function http.getRequestAge(){ - http._wd "${FUNCNAME[0]}($1)" - typeset -i local iAge=`date +%s`-`http.getRequestTs` - echo $iAge + http._wd "${FUNCNAME[0]}()" + local iAge; typeset -i iAge + local iTs; typeset -i iTs + iTs=$( http.getRequestTs ) + iAge=$( date +%s )-${iTs} + echo "$iAge" } # ---------- PUBLIC RESPONSE GETTER - # get response body + # ...................................................................... + # + # Get response body + # + # no param + # + # returns string the response body + # function http.getResponse(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http._getFilteredResponse BODY } - # get curl data of this request with status, transferred bytes, speed, ... + + # ...................................................................... + # + # Get curl data of this request with status, transferred bytes, speed, ... + # + # no param + # + # returns string the response data + # function http.getResponseData(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http._getFilteredResponse DATA } - # get response header + + # ...................................................................... + # + # Get response header + # + # no param + # + # returns string the response header + # function http.getResponseHeader(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http._getFilteredResponse HEADER } - # get raw response (not available after import) + # ...................................................................... + # + # Get raw response (not available after import) + # + # no params + # + # no param + # function http.getResponseRaw(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" echo "${http_resp__all}" } - # get Http status as string OK|Redirect|Error + # ...................................................................... + # + # Get Http status as string OK|Redirect|Error + # + # no params + # function http.getStatus(){ http._wd "${FUNCNAME[0]}($1)" http.isOk >/dev/null && echo OK @@ -355,48 +496,85 @@ EOH http.isError >/dev/null && echo Error } - # get Http status code of the request as 3 digit number + # ...................................................................... + # + # Get Http status code of the request as 3 digit number + # + # no params + # function http.getStatuscode(){ - http._wd "${FUNCNAME[0]}($1)" - local _filter=$1 + http._wd "${FUNCNAME[0]}()" http.getResponseData | grep "^http_code:" | cut -f 2 -d ":" } - # was response a 2xx status code? + # ...................................................................... + # + # Check: was response a 2xx status code? # output is a statuscode if it matches ... or empty # Additionally you can verify the return code + # # $? -eq 0 means YES # $? -ne 0 means NO + # + # no params + # function http.isOk(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.getStatuscode | grep '2[0-9][0-9]' } - # was the repsonse a redirect? + + # ...................................................................... + # + # Was the repsonse a redirect? + # + # no params + # function http.isRedirect(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.getStatuscode | grep '3[0-9][0-9]' } - # was the repsonse a client error (4xx or 5xx) + # ...................................................................... + # + # Was the repsonse a client error (4xx or 5xx) + # + # no params + # function http.isError(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.getStatuscode | grep '[45][0-9][0-9]' } - # was the repsonse a client error (4xx) + + # ...................................................................... + # + # Was the repsonse a client error (4xx) + # + # no params + # function http.isClientError(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.getStatuscode | grep '4[0-9][0-9]' } - # was the repsonse a client error (5xx) + + # ...................................................................... + # + # Was the repsonse a client error (5xx) + # + # no params + # function http.isServerError(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.getStatuscode | grep '5[0-9][0-9]' } - - # dump information about request and response + # ...................................................................... + # + # Dump information about request and response + # + # no params + # function http.dump(){ - http._wd "${FUNCNAME[0]}($1)" + http._wd "${FUNCNAME[0]}()" http.responseExport } @@ -404,41 +582,56 @@ EOH # Import/ Export # ====================================================================== - # helper to replace "AUTOFILE" with something uniq using full url + # ...................................................................... + # + # Helper to replace "AUTOFILE" with something uniq using full url + # # param string import or export filename + # function http._genOutfilename(){ http._wd "${FUNCNAME[0]}($1)" - echo $1 | grep "AUTOFILE" >/dev/null - if [ $? -ne 0 ]; then - echo $1 + if echo "$1" | grep -q "AUTOFILE"; then + echo "$1" else - local sum=`echo ${http_req__fullurl} | sha1sum ` - local autofile=`echo "${sum}__${http_req__fullurl}" | sed "s#[^a-z0-9]#_#g"` - echo $1 | sed "s#AUTOFILE#${autofile}#" + local sum + sum=$(echo ${http_req__fullurl} | sha1sum ) + local autofile + autofile=$(echo "${sum}__${http_req__fullurl}" | sed "s#[^a-z0-9]#_#g") + echo "$1" | sed "s#AUTOFILE#${autofile}#" fi } - - # export to a file + # ...................................................................... + # + # Export response to a file + # + # param string optional: custom filename + # function http.responseExport(){ http._wd "${FUNCNAME[0]}($1)" - if [ -z $1 ]; then + if [ -z "$1" ]; then echo "${http_resp__neutral}" else - local outfile=`http._genOutfilename "$1"` + local outfile + outfile=$(http._genOutfilename "$1") http._wd "${FUNCNAME[0]}($1) writing to outfile $outfile" - echo "${http_resp__neutral}" >$outfile + echo "${http_resp__neutral}" >"$outfile" fi } - # import a former response from a file + # ...................................................................... + # + # Import a former response from a file + # + # param string filename with stored response + # function http.responseImport(){ http._wd "${FUNCNAME[0]}($1)" - local infile=`http._genOutfilename "$1"` + local infile + infile=$(http._genOutfilename "$1") if [ -r "${infile}" ]; then - grep "^#_META_|about:$http_cfg__about" "${infile}" >/dev/null - if [ $? -eq 0 ]; then - http_resp__neutral=`cat "${infile}"` + if grep -q "^#_META_|about:$http_cfg__about" "${infile}"; then + http_resp__neutral=$(cat "${infile}") else echo "ERROR: Ooops [${infile}] does not seem to be an export dump." http.quit @@ -448,16 +641,21 @@ EOH http.quit fi } - # delete an exported file; this is especially useful if you use + + # ...................................................................... + # + # Delete an exported file; this is especially useful if you use # AUTOFILE functionality + # + # param string filename with stored response + # function http.responseDelete(){ http._wd "${FUNCNAME[0]}($1)" - local infile=`http._genOutfilename "$1"` + local infile + infile=$(http._genOutfilename "$1") if [ -r "${infile}" ]; then - grep "^#_META_|about:$http_cfg__about" "${infile}" >/dev/null - if [ $? -eq 0 ]; then - rm -f "${infile}" - if [ $? -eq 0 ]; then + if grep -q "^#_META_|about:$http_cfg__about" "${infile}"; then + if rm -f "${infile}"; then http._wd "OK, ${infile} was deleted." else http._wd "ERROR: unable to delete existing ${infile}. Check permissions." @@ -474,32 +672,95 @@ EOH # SETTER # ====================================================================== - # set authentication - # param string USER:PASSWORD + # ...................................................................... + # + # Add a line to the request header + # + # param string line to add, eg "Connection: keep-alive" + # + function http.addHeader(){ + http._wd "${FUNCNAME[0]}($1)" + http_req__headers+=( -H "$1") + } + + # ...................................................................... + # + # set Accept request header and override default + # + # param string accept header value, eg text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 + # + function http.setAccept(){ + http._wd "${FUNCNAME[0]}($1)" + if [ -z "$1" ]; then + http_req__accept= + else + http_req__accept="$1" + fi + } + + # ...................................................................... + # + # Set basic authentication + # Without given parameter, authentication is removed + # + # param string optional: USER:PASSWORD + # function http.setAuth(){ http._wd "${FUNCNAME[0]}($1)" if [ -z "$1" ]; then http_req__auth= else - http_req__auth="-u $1" + http_req__auth="$1" + fi + } + + # ...................................................................... + # + # Set authentication via Athorization header + # Without given parameter, authorization is removed + # + # param string optional: type, eg. Basic|Bearer|Negotiate + # param string optional: token or encoded user + password + # + function http.setAuthorization(){ + http._wd "${FUNCNAME[0]}($1 $2)" + if [ -z "$1" ]; then + http_req__authorization= + else + http_req__authorization="${1} ${2}" fi } - # set body to send for PUTs and POSTs + + # ...................................................................... + # + # Set body to send for PUTs and POSTs + # # param string body + # function http.setBody(){ http._wd "${FUNCNAME[0]}($1)" http_req__body=$1 } - # set a base url of an API + + # ...................................................................... + # + # Set a base url of an API # Remark: Then use http.setUrl to complet the url to request + # # param string url + # function http.setBaseUrl(){ http._wd "${FUNCNAME[0]}($1)" http_req__baseurl=$1 - http.setFullUrl + http.setFullUrl "" } + + # ...................................................................... + # # Enable or disable debug mode + # # param integer 0|1 + # function http.setDebug(){ http._wd "${FUNCNAME[0]}($1)" http_cfg__debug=$1 @@ -509,15 +770,23 @@ EOH http_req__docs=$1 } - # set the method to use; GET|POST|PUT|DELETE + # ...................................................................... + # + # Set the method to use; GET|POST|PUT|DELETE|... + # # param string name of method + # function http.setMethod(){ http._wd "${FUNCNAME[0]}($1)" http_req__method=$1 } - # set a full url to request - # param string url + # ...................................................................... + # + # Set a full url to request + # + # param string optional: url + # function http.setFullUrl(){ http._wd "${FUNCNAME[0]}($1)" if [ -z "$1" ]; then @@ -526,8 +795,13 @@ EOH http_req__fullurl=$1 fi } - # complete the base url + + # ...................................................................... + # + # Complete the base url + # # param string url part behind base url + # function http.setUrl(){ http._wd "${FUNCNAME[0]}($1)" http_req__url=$1 @@ -536,16 +810,34 @@ EOH # ----- caching + # ...................................................................... + # + # Set cache ttl in seconds + # + # param integer ttl in seconds + # function http.setCacheTtl(){ http._wd "${FUNCNAME[0]}($1)" http_cfg__cacheTtl=$1 } + # ...................................................................... + # + # Set cache file + # + # param string filename + # function http.setCacheFile(){ http._wd "${FUNCNAME[0]}($1)" http_cfg__cacheFile="$1" } + # ...................................................................... + # + # Flush the cache + # + # no params + # function http.flushCache(){ http._wd "${FUNCNAME[0]}($1)" rm -f ${http_cfg__cacheDir}/* @@ -554,7 +846,9 @@ EOH # ...................................................................... # # show a help text + # # no params + # function http.help(){ cat <<EOH @@ -562,7 +856,8 @@ $http_cfg__about This is a bash solution to script REST API calls. -Source:$http_cfg__prjurl +Source: <$http_cfg__prjurl> +Docs: <$http_cfg__docsurl> License: GNU GPL 3 @@ -581,8 +876,19 @@ INSTRUCTION: - initialize a request + setAccept ACCEPT + Set authentication with user and password for basic auth + Default: $http_req__accept + setAuth AUTH:PASSWORD - set authentication + Set authentication with user and password for basic auth + Without given parameter, authentication is removed + + setAuthorization TYPE TOKEN|HASH + Set authentication with Authorization header. + As TYPE you can use Basic|Bearer|Negotiate|... + 2nd param is the token or hased user+password + Without given parameter, authorization is removed http.setBody DATA set a body for POST/ PUT requests. @@ -604,6 +910,10 @@ INSTRUCTION: Set a relative url for a request. This requires to use http.setBaseUrl before. + http.addHeader HEADER_LINE + Add a header line to the request. + This command can be repeated multiple times. + - caching functions http.setCacheTtl SECONDS @@ -646,8 +956,11 @@ INSTRUCTION: - check http status code + http.getStatus + Get the http status as string Ok|Redirect|Error + http.getStatuscode - Get the http status code of a request + Get the http status code of a request as 3 digit integer http.isOk Check if the http response code is a 2xx diff --git a/inc/update_rest-api-client.sh b/inc/update_rest-api-client.sh new file mode 100755 index 0000000000000000000000000000000000000000..d933fbaadbc7fed10926689dd69a76f8e6fc8bfe --- /dev/null +++ b/inc/update_rest-api-client.sh @@ -0,0 +1,2 @@ +#!/bin/sh +wget -O rest-api-client.sh https://git-repo.iml.unibe.ch/iml-open-source/bash-rest-api-client/-/raw/master/rest-api-client.sh