¿Cómo se puede depurar una solicitud CORS con cURL?


¿Cómo puede depurar solicitudes CORS usando cURL? Hasta ahora no he podido encontrar ninguna manera de "simular" la solicitud de comprobación previa .

 198
Author: themihai, 2012-08-29

3 answers

Así es como puede depurar solicitudes CORS usando curl.

Enviar una solicitud CORS normal usando cUrl:

curl -H "Origin: http://example.com" --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

La bandera -H "Origin: http://example.com" es el dominio de terceros que realiza la solicitud. Sustituya en cualquiera que sea su dominio.

La bandera --verbose imprime la respuesta completa para que pueda ver los encabezados de solicitud y respuesta.

La url que estoy usando anteriormente es una solicitud de ejemplo a una API de Google que admite CORS, pero puede sustituirla en cualquier url que sea prueba.

La respuesta debe incluir el encabezado Access-Control-Allow-Origin.

Enviar una solicitud de comprobación previa usando 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=

Esto se parece a la solicitud CORS regular con algunas adiciones:

Las banderas -H envían encabezados adicionales de solicitud de comprobación previa al servidor

El indicador -X OPTIONS indica que se trata de una solicitud de OPCIONES HTTP.

Si la solicitud de comprobación previa es exitosa, la respuesta debe incluir Access-Control-Allow-Origin, Access-Control-Allow-Methods, y Access-Control-Allow-Headers encabezados de respuesta. Si la solicitud de comprobación previa no tuvo éxito, estos encabezados no deberían aparecer, o la respuesta HTTP no será 200.

También puede especificar encabezados adicionales, como User-Agent, utilizando la bandera -H.

 354
Author: monsur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-29 14:01:12

Respuesta actualizada que cubre la mayoría de los casos

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Sustitúyase http://localhost con la URL que desea probar.
  2. Si la respuesta incluye Access-Control-Allow-* entonces su recurso soporta CORS.

Justificación de la alternativa de respuesta

Google esta pregunta de vez en cuando y la respuesta aceptada nunca es lo que necesito. Primero imprime el cuerpo de la respuesta que es mucho texto. Agregar ---head solo genera encabezados. En segundo lugar, al probar las URL de S3, necesitamos proporcione un encabezado adicional -H "Access-Control-Request-Method: GET".

Espero que esto ahorre tiempo.

 13
Author: Vilius Paulauskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 13:29:32

El script bash "corstest" a continuación funciona para mí. Se basa en comentario de Jun arriba.

Uso

Corstest [- v] url

Ejemplos

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *

, El resultado positivo se muestra en verde

./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

El resultado negativo se muestra en rojo y azul

La opción-v mostrará los encabezados curl completos

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
Author: Wolfgang Fahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-20 16:32:00