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 .

198
demandé sur themihai 2012-08-29 12:44:43

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.

354
répondu monsur 2012-08-29 14:01:12

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/
  1. Remplacer http://localhost avec l'URL que vous souhaitez tester.
  2. 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.

13
répondu Vilius Paulauskas 2018-05-22 13:29:32

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
0
répondu Wolfgang Fahl 2018-09-20 16:32:00