Não há como diferenciá-lo dos navegadores da web mais recentes.
Especificação W3C:
As etapas abaixo descrevem o que os agentes do usuário devem fazer para uma solicitação simples de origem cruzada :
Aplique as etapas de fazer uma solicitação e observe as regras de solicitação abaixo ao fazer a solicitação.
Se o sinalizador de redirecionamento manual não estiver definido e a resposta tiver um código de status HTTP de 301, 302, 303, 307 ou 308,
aplique as etapas de redirecionamento.
Se o usuário final cancelar a solicitação,
aplique as etapas de anulação.
Se houver um erro de rede
No caso de erros de DNS, falha de negociação TLS ou outro tipo de erro de rede, aplique as etapas de erro de rede . Não solicite nenhum tipo de interação do usuário final.
Observação: isso não inclui respostas HTTP que indicam algum tipo de erro, como o código de status HTTP 410.
Caso contrário,
execute uma verificação de compartilhamento de recursos. Se retornar falha, aplique as etapas de erro de rede. Caso contrário, se ele retornar pass, termine este algoritmo e defina o status da solicitação de origem cruzada para sucesso. Na verdade, não encerre a solicitação.
Como você pode ler, os erros de rede não incluem respostas HTTP que incluem erros, por isso você obterá sempre 0 como código de status e "" como erro.
Fonte
Nota : Os exemplos a seguir foram feitos usando o Google Chrome versão 43.0.2357.130 e em um ambiente que criei para emular o OP one. O código para configurá-lo está na parte inferior da resposta.
I embora que uma abordagem para contornar este seria fazer um pedido secundário através de HTTP em vez de HTTPS como Essa resposta , mas eu lembrei que não é possível devido que as versões mais recentes de navegadores bloquear conteúdo misto.
Isso significa que o navegador da Web não permitirá uma solicitação por HTTP se você estiver usando HTTPS e vice-versa.
Isso tem sido assim desde alguns anos atrás, mas versões mais antigas do navegador da Web, como o Mozilla Firefox, abaixo das versões 23, permitem isso.
Provas sobre isso:
Fazendo uma solicitação HTTP de HTTPS usign console Web Broser
var request = new XMLHttpRequest();
request.open('GET', "http://localhost:8001", true);
request.onload = function () {
console.log(request.responseText);
};
request.onerror = function () {
console.log(request.responseText);
};
request.send();
resultará no seguinte erro:
Conteúdo misto: a página em ' https: // localhost: 8000 / ' foi carregada por HTTPS, mas solicitou um ponto de extremidade XMLHttpRequest inseguro ' http: // localhost: 8001 / '. Esta solicitação foi bloqueada; o conteúdo deve ser servido por HTTPS.
O mesmo erro aparecerá no console do navegador se você tentar fazer isso de outras maneiras, como adicionar um Iframe.
<iframe src="http://localhost:8001"></iframe>
O uso de conexão Socket também foi postado como uma resposta , eu tinha certeza de que o resultado será o mesmo / semelhante, mas tentei.
Tentar abrir uma conexão de soquete do Web Broswer usando HTTPS para um endpoint de soquete não seguro resultará em erros de conteúdo misto.
new WebSocket("ws://localhost:8001", "protocolOne");
1) Conteúdo misto: A página em ' https: // localhost: 8000 / ' foi carregada por HTTPS, mas tentou se conectar ao ponto de extremidade WebSocket inseguro 'ws: // localhost: 8001 /'. Esta solicitação foi bloqueada; este terminal deve estar disponível no WSS.
2) DOMException não capturada: Falha ao construir 'WebSocket': Uma conexão WebSocket insegura não pode ser iniciada a partir de uma página carregada em HTTPS.
Em seguida, tentei me conectar a um endpoint wss também, veja se eu pudesse ler algumas informações sobre erros de conexão de rede:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
Executar o snippet acima com o servidor desativado resulta em:
Falha na conexão do WebSocket com 'wss: // localhost: 8001 /': Erro no estabelecimento da conexão: net :: ERR_CONNECTION_REFUSED
Executando o snippet acima com o servidor ativado
Falha na conexão do WebSocket com 'wss: // localhost: 8001 /': o handshake de abertura do WebSocket foi cancelado
Mas, novamente, o erro de que a saída da "função onerror" para o console não tem dica para diferenciar um erro do outro.
Usar um proxy como essa resposta sugere pode funcionar, mas apenas se o servidor "destino" tiver acesso público.
Este não foi o caso aqui, então tentar implementar um proxy neste cenário nos levará ao mesmo problema.
Código para criar servidor HTTPS Node.js :
Criei dois servidores HTTPS Nodejs, que usam certificados autoassinados:
targetServer.js:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./certs2/key.pem'),
cert: fs.readFileSync('./certs2/key-cert.pem')
};
https.createServer(options, function (req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.writeHead(200);
res.end("hello world\n");
}).listen(8001);
applicationServer.js:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./certs/key.pem'),
cert: fs.readFileSync('./certs/key-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
Para que funcione, você precisa ter o Nodejs instalado, precisa gerar certificados separados para cada servidor e armazená-los nas pastas certs e certs2 de acordo.
Para executá-lo basta executar node applicationServer.js
e node targetServer.js
em um terminal (exemplo do ubuntu).