я симулирую CORS с cURL правильно и мне нужно реализовать запрос OPTIONS - PullRequest
0 голосов
/ 12 января 2019

Я не очень хорошо разбираюсь в разработке веб-серверов и в том, как понимаю, как именно работают заголовки http Я немного читал, но все еще немного сбит с толку. В данный момент я пытаюсь смоделировать запрос CORS с помощью cURL. (Нужно для личного развития). Для этого я нашел простой REST-сервер, написанный на C (C - язык, с которым я больше всего знаком). Код на самом деле находится здесь . Я нашел этот пост , который объясняет, как имитировать CORS.

Вот проблема:

Если я бегу

curl -H "Origin: http://localhost:3000" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS --verbose \
  http://localhost:8537/test

Запрос не выполняется со следующим ответом

*   Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8537 failed: Connection refused
*   Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8537 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8537 (#0)
> OPTIONS /test HTTP/1.1
> Host: localhost:8537
> User-Agent: curl/7.61.1
> Accept: */*
> Origin: http://localhost:3000
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Request-With
>
< HTTP/1.1 404 Not Found
< Connection: Keep-Alive
< Content-Length: 32
< Access-Control-Allow-Origin: *
< Date: Sat, 12 Jan 2019 02:21:59 GMT
<
* Connection #0 to host localhost left intact
Page not found, do what you want

Однако, если я выполню тот же запрос с -X POST вместо -X OPTIONS, т.е.

curl -H "Origin: http://localhost:3000" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X POST --verbose \
  http://localhost:8537/test

Запрос успешно выполняется со следующим ответом:

*   Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8537 failed: Connection refused
*   Trying ::1...
* TCP_NODELAY set
* connect to ::1 port 8537 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8537 (#0)
> POST /test HTTP/1.1
> Host: localhost:8537
> User-Agent: curl/7.61.1
> Accept: */*
> Origin: http://localhost:3000
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Request-With
>
< HTTP/1.1 200 OK
< Connection: Keep-Alive
< Content-Length: 19
< Access-Control-Allow-Origin: *
< Date: Sat, 12 Jan 2019 02:25:28 GMT
<
Hello World!
* Connection #0 to host localhost left intact
(null)

Я получаю те же результаты, если выполнить

curl -H "Origin: http://localhost:3000" -X OPTIONS --verbose http://localhost:8537/test

и

curl -H "Origin: http://localhost:3000" -X POST --verbose http://localhost:8537/test

Т.е. запрос не выполняется с запросом OPTIONS и выполняется с запросом POST.

Код учитывает CORS (по крайней мере, то, что я думаю). Вот строка кода, которая делает это

u_map_put(instance.default_headers, "Access-Control-Allow-Origin", "*");

Итак, вот вопросы:

  1. Для имитации CORS мне нужно использовать запрос OPTIONS или запрос POST?
  2. Если бы я должен был написать сервер, аналогичный серверу, приведенному в примере, нужно ли мне реализовывать ответ OPTIONS, или я могу сойти с рук с помощью POST / GET?

1 Ответ

0 голосов
/ 20 января 2019

В CORS OPTIONS используется для предварительных запросов . Вам необязательно обрабатывать OPTIONS запросы, если вы отправляете только «простые» запросы CORS.

Вы можете прочитать определение Simple CORS Request здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...