Jak debugować żądanie CORS za pomocą cURL?

Jak można debugować żądania CORS za pomocą cURL? Jak dotąd nie mogłem znaleźć sposobu na "symulację" żądania inspekcji wstępnej .

 198
Author: themihai, 2012-08-29

3 answers

Oto jak można debugować żądania CORS za pomocą curl.

Wysyłanie zwykłego żądania CORS za pomocą cUrl:

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

Znacznik -H "Origin: http://example.com" jest domeną strony trzeciej składającą żądanie. Zastąp cokolwiek Twoja domena jest.

Flaga --verbose wyświetla całą odpowiedź, dzięki czemu można zobaczyć nagłówki żądania i odpowiedzi.

Adres URL, którego używam powyżej, jest przykładowym żądaniem do Google API, które obsługuje CORS, ale możesz zastąpić dowolny adres url testuję.

Odpowiedź powinna zawierać nagłówek Access-Control-Allow-Origin.

Wysyłanie żądania inspekcji wstępnej za pomocą 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=

Wygląda to podobnie do zwykłego żądania Kors z kilkoma dodatkami:

Flagi -H wysyłają dodatkowe nagłówki żądania inspekcji wstępnej do serwera

Znacznik -X OPTIONS wskazuje, że jest to żądanie opcji HTTP.

Jeśli żądanie inspekcji wstępnej zakończy się sukcesem, odpowiedź powinna zawierać Access-Control-Allow-Origin, Access-Control-Allow-Methods, oraz Access-Control-Allow-Headers nagłówki odpowiedzi. Jeśli żądanie inspekcji wstępnej nie powiodło się, te nagłówki nie powinny się pojawić lub odpowiedź HTTP nie będzie wynosić 200.

Możesz również określić dodatkowe nagłówki, takie jak User-Agent, używając znacznika -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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-29 14:01:12

Zaktualizowana odpowiedź, która obejmuje większość przypadków

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. Zastąp http://localhost z adresem URL, który chcesz przetestować.
  2. Jeśli odpowiedź zawiera {[1] } to Twój zasób obsługuje CORS.

Uzasadnienie alternatywnej odpowiedzi

Googluję to pytanie co jakiś czas i zaakceptowana odpowiedź nigdy nie jest tym, czego potrzebuję. Najpierw drukuje ciało odpowiedzi, które jest dużo tekstu. Dodawanie ---head wyprowadza tylko nagłówki. Po drugie podczas testowania adresów URL S3 musimy podaj dodatkowy nagłówek -H "Access-Control-Request-Method: GET".

Mam nadzieję, że to zaoszczędzi czas.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 13:29:32

Skrypt bash "corstest" poniżej działa dla mnie. Opiera się na komentarzu Jun powyżej.

Użycie

Corstest [- V] url

Przykłady

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

Pozytywny wynik jest wyświetlany na Zielono

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

Wynik ujemny jest wyświetlany na czerwono i niebiesko

Opcja-v wyświetli pełne nagłówki curl

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 16:32:00