From what I've read about CORS, I understand it should work as follows:
- Script on a client side tries to fetch a resource from a server with different origin.
- Browser intercepts this request and first makes preflight OPTIONS request to the same URL.
- If response to this preflight request contains appropriate headers (e.g.
Access-Control-Allow-Origin: *
), browser understands it's allowed to send main request and does it. - Response is returned to the client script.
I've set up a test for it like this:
- server in Go accepting both - GET and OPTIONS requests (checked using CURL) - and setting
Access-Control-*
headers in response simple HTML page (served by another server on another port) with the following script in it (
$
stands for jQuery):$.ajax({ type: "GET", crossDomain: true, url: "http://local.site.com/endpoint, success: function (data) { alert(data); }, error: function (request, error) { alert(error); } });
When I call this method, however, I see only one GET and no preflight OPTIONS request in the Network tab in both - Chrome 49 and Firefox 33.
Here are details of my GET request from Chrome:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Connection:keep-alive
Host:local.adform.com
Origin:http://localhost:7500
Referer:http://localhost:7500/test-page.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
and corresponding response:
Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Content-Length:2
Content-Type:text/plain; charset=utf-8
Date:Wed, 03 Aug 2016 10:53:19 GMT
Any thoughts on why my browser(s) don't send preflight request?