Comment pouvez-vous déboguer les demandes CORS en utilisant cURL? Jusqu'à présent, je n'ai trouvé aucun moyen de "simuler" la demande de contrôle en amont.
Voici comment vous pouvez déboguer des demandes CORS en utilisant curl.
Envoi d'une requête CORS standard à l'aide de cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Le drapeau -H "Origin: http://example.com"
est le domaine tiers qui fait la demande. Remplacez quel que soit votre domaine.
L'indicateur --verbose
imprime l'intégralité de la réponse afin que vous puissiez voir les en-têtes de demande et de réponse.
L'URL que j'utilise ci-dessus est un exemple de demande adressée à une API Google qui prend en charge CORS, mais vous pouvez le remplacer par l'URL que vous testez.
La réponse doit inclure l'en-tête Access-Control-Allow-Origin
.
Envoi d'une requête de contrôle en amont à l'aide de cUrl:
curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Cela ressemble à la demande CORS normale avec quelques ajouts:
Les indicateurs -H
envoient d’en-têtes de requête de contrôle en amont supplémentaires au serveur.
L'indicateur -X OPTIONS
indique qu'il s'agit d'une demande HTTP OPTIONS.
Si la demande de contrôle en amont aboutit, la réponse doit inclure les en-têtes de réponse Access-Control-Allow-Origin
, Access-Control-Allow-Methods
et Access-Control-Allow-Headers
. Si la requête de contrôle en amont a échoué, ces en-têtes ne doivent pas apparaître ou la réponse HTTP ne sera pas 200.
Vous pouvez également spécifier d'autres en-têtes, tels que User-Agent
, à l'aide de l'indicateur -H
.
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
Access-Control-Allow-*
, votre ressource prend en charge CORS.Justification de la réponse alternative
J'examine cette question de temps en temps et la réponse acceptée n'est jamais ce dont j'ai besoin. D'abord, il imprime le corps de la réponse qui contient beaucoup de texte. L'ajout de ---head
ne génère que les en-têtes. Deuxièmement, lors du test des URL S3, nous devons fournir un en-tête supplémentaire -H "Access-Control-Request-Method: GET"
.
J'espère que cela vous fera gagner du temps.
On dirait que cela fonctionne:
_curl -I http://example.com
_
Recherchez Access-Control-Allow-Origin: *
dans les en-têtes renvoyés.
Le script bash "corstest" ci-dessous fonctionne pour moi. Il est basé sur le commentaire de juin ci-dessus.
usage
corstest [-v] url
exemples
./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
le résultat positif est affiché en vert
./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS
le résultat négatif est affiché en rouge et bleu
l'option -v affichera les en-têtes complets
corstest
#!/bin/bash
# WF 2018-09-20
# https://stackoverflow.com/a/47609921/1497139
#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'
#
# a colored message
# params:
# 1: l_color - the color of the message
# 2: l_msg - the message to display
#
color_msg() {
local l_color="$1"
local l_msg="$2"
echo -e "${l_color}$l_msg${endColor}"
}
#
# show the usage
#
usage() {
echo "usage: [-v] $0 url"
echo " -v |--verbose: show curl result"
exit 1
}
if [ $# -lt 1 ]
then
usage
fi
# commandline option
while [ "$1" != "" ]
do
url=$1
shift
# optionally show usage
case $url in
-v|--verbose)
verbose=true;
;;
esac
done
if [ "$verbose" = "true" ]
then
curl -s -X GET $url -H 'Cache-Control: no-cache' --head
fi
Origin=$(curl -s -X GET $url -H 'Cache-Control: no-cache' --head | grep Access-Control)
if [ $? -eq 0 ]
then
color_msg $green "$url $Origin"
else
color_msg $red "$url does not support CORS"
color_msg $blue "you might want to visit https://enable-cors.org/ to find out how to enable CORS"
fi