Comment Pouvez-vous déboguer une requête CORS avec cURL?
Comment Pouvez-vous déboguer les requêtes CORS en utilisant cURL? Jusqu'à présent, je n'ai trouvé aucun moyen de" simuler " la demande de contrôle en amont .
3 réponses
Voici comment déboguer les requêtes CORS en utilisant curl.
Envoi d'une requête cors régulière à l'aide de cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
L'indicateur -H "Origin: http://example.com"
est le domaine tiers qui effectue la requête. Remplacez-le quel que soit votre domaine.
Le drapeau --verbose
imprime la réponse entière afin que vous puissiez voir les en-têtes de requête et de réponse.
L'url que j'utilise ci-dessus est un exemple de requête à une API Google qui prend en charge CORS, mais vous pouvez remplacer quelle que soit l'url que vous êtes test.
La réponse doit inclure l'en-tête Access-Control-Allow-Origin
.
Envoi d'une demande de contrôle en utilisant 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 requête cors régulière avec quelques ajouts:
Les indicateurs -H
envoient des en-têtes de demande de contrôle en amont supplémentaires au serveur
L'indicateur -X OPTIONS
indique qu'il s'agit d'une requête D'OPTIONS HTTP.
Si la demande de contrôle préalable est réussie, la réponse doit inclure Access-Control-Allow-Origin
, Access-Control-Allow-Methods
, et Access-Control-Allow-Headers
en-têtes de réponse. Si la demande de contrôle préalable n'a pas réussi, ces en-têtes ne devraient pas apparaître, ou la réponse HTTP ne sera pas 200.
, Vous pouvez également spécifier des en-têtes supplémentaires, tels que User-Agent
, en utilisant le -H
drapeau.
Réponse mise à jour qui couvre la plupart des cas
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
- Remplacer http://localhost avec l'URL que vous souhaitez tester.
- Si la réponse inclut
Access-Control-Allow-*
alors votre ressource prend en charge CORS.
Justification de la réponse alternative
Je google 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 réponse qui est beaucoup de texte. L'ajout de ---head
ne génère que des 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 fera gagner du temps.
Le script bash "corstest" ci-dessous fonctionne pour moi. Il est basé sur commentaire de Jun ci-dessus.
L'Utilisation de
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 de boucle 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