Я настроил сервер на http://localhost:8080, где http://example.com может выполнять запросы POST:
'use strict';
const express = require ('express');
const app = express();
const port = 8080;
// allowing CORS for example.com
app.use ('/', function (req, res, next){
res.header ('Access-Control-Allow-Origin', 'http://example.com');
if (req.method === 'OPTIONS'){
res.header ('Access-Control-Allow-Methods', 'OPTIONS, POST');
res.header ('Access-Control-Allow-Headers', 'Content-Type, Content-Length');
res.status (200).send ();
}else next();
});
// handling POST requests
app.use ('/', function (req, res){
console.log ('a client did a POST request');
res.status (200);
});
app.listen (port, () => console.log ('server started on port ' + port));
Работает нормально: я не могу выполнить запрос POST к http://localhost:8080 из http://localhost:8081 из-за той же политики происхождения.
Затем я написал веб-расширение для Firefox, которое попытается выполнить запрос POST к http://localhost:8080 из любого домена.
Вот его манифест:
{
"manifest_version" : 2,
"name" : "aBasicExtension",
"version" : "0.0.0",
"content_scripts" : [
{
"matches" : ["<all_urls>"],
"js" : ["content-script.js"]
}
],
"permissions" : ["*://*.localhost/*"]
}
и content-script.js
код:
(() => {
'use strict';
const xhr = new XMLHttpRequest();
xhr.open ('POST', 'http://localhost:8080');
xhr.setRequestHeader ('Content-Type', 'application/json; charset=utf-8');
xhr.addEventListener ('readystatechange', () => {
if (xhr.readyState === XMLHttpRequest.DONE){
if (xhr.status === 200) console.log ('OK');
else console.error ('an error has occured : ' + xhr.status);
}
});
xhr.send (JSON.stringify ({dataName:'some data here'}));
})();
Что я не понимаю, так это то, что это работает. Расширение выполняет запрос к http://localhost:8080, и Firefox не блокирует его, потому что манифест это позволяет, однако сервер (http://locahost:8080) не дал свое разрешение .