web-dev-qa-db-fra.com

Comment pouvez-vous déboguer une demande CORS avec cURL?

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.

253
themihai

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.

429
monsur

Réponse mise à jour couvrant la plupart des cas

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Remplacez http: // localhost par l'URL que vous souhaitez tester.
  2. Si la réponse inclut 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.

37
Vilius Paulauskas

On dirait que cela fonctionne:

_curl -I http://example.com_

Recherchez Access-Control-Allow-Origin: * dans les en-têtes renvoyés.

3
MalcolmOcean

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
1
Wolfgang Fahl