Tidak ada cara untuk membedakannya dari Browser Web terbaru.
Spesifikasi W3C:
Langkah-langkah di bawah ini menjelaskan apa yang harus dilakukan agen pengguna untuk permintaan lintas sumber sederhana :
Terapkan langkah-langkah membuat permintaan dan amati aturan permintaan di bawah ini saat membuat permintaan.
Jika tanda pengalihan manual tidak disetel dan responsnya memiliki kode status HTTP 301, 302, 303, 307, atau 308
Terapkan langkah pengalihan.
Jika pengguna akhir membatalkan permintaan
Terapkan langkah-langkah membatalkan.
Jika ada kesalahan jaringan
Jika terjadi kesalahan DNS, kegagalan negosiasi TLS, atau jenis kesalahan jaringan lainnya, terapkan langkah-langkah kesalahan jaringan . Jangan meminta interaksi pengguna akhir apa pun.
Catatan: Ini tidak termasuk tanggapan HTTP yang menunjukkan beberapa jenis kesalahan, seperti kode status HTTP 410.
Jika tidak,
Lakukan pemeriksaan berbagi sumber daya. Jika kembali gagal, terapkan langkah-langkah kesalahan jaringan. Jika tidak, jika mengembalikan pass, hentikan algoritme ini dan setel status permintaan lintas sumber ke sukses. Jangan benar-benar menghentikan permintaan tersebut.
Seperti yang bisa Anda baca, kesalahan jaringan tidak menyertakan respons HTTP yang menyertakan kesalahan, itulah sebabnya Anda akan selalu mendapatkan 0 sebagai kode status, dan "" sebagai kesalahan.
Sumber
Catatan : Contoh berikut dibuat menggunakan Google Chrome Versi 43.0.2357.130 dan terhadap lingkungan yang saya buat untuk meniru OP satu. Kode untuk mengaturnya ada di bagian bawah jawaban.
Saya berpikir bahwa pendekatan Untuk mengatasi ini akan membuat permintaan sekunder melalui HTTP daripada HTTPS sebagai jawaban ini tetapi saya ingat itu tidak mungkin karena versi browser yang lebih baru memblokir konten campuran.
Artinya, Browser Web tidak akan mengizinkan permintaan melalui HTTP jika Anda menggunakan HTTPS dan sebaliknya.
Ini sudah seperti ini sejak beberapa tahun yang lalu tetapi versi Browser Web yang lebih lama seperti Mozilla Firefox di bawahnya versi 23 memungkinkannya.
Bukti tentang itu:
Membuat permintaan HTTP dari HTTPS menggunakan konsol 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();
akan menghasilkan kesalahan berikut:
Konten Campuran: Halaman di ' https: // localhost: 8000 / ' dimuat melalui HTTPS, tetapi meminta titik akhir XMLHttpRequest ' http: // localhost: 8001 / ' yang tidak aman. Permintaan ini telah diblokir; konten harus disajikan melalui HTTPS.
Kesalahan yang sama akan muncul di konsol browser jika Anda mencoba melakukan ini dengan cara lain seperti menambahkan Iframe.
<iframe src="http://localhost:8001"></iframe>
Menggunakan koneksi Socket juga diposting sebagai jawaban , saya cukup yakin bahwa hasilnya akan sama / mirip tetapi saya sudah mencobanya.
Mencoba membuka koneksi soket dari Web Broswer menggunakan HTTPS ke titik akhir soket non Secure akan berakhir dengan kesalahan konten campuran.
new WebSocket("ws://localhost:8001", "protocolOne");
1) Konten Campuran: Halaman di ' https: // localhost: 8000 / ' dimuat melalui HTTPS, tetapi berusaha menyambung ke titik akhir WebSocket yang tidak aman 'ws: // localhost: 8001 /'. Permintaan ini telah diblokir; titik akhir ini harus tersedia melalui WSS.
2) DOMException yang tidak tertangkap: Gagal membuat 'WebSocket': Sambungan WebSocket yang tidak aman tidak dapat dimulai dari halaman yang dimuat melalui HTTPS.
Kemudian saya mencoba menyambung ke titik akhir wss juga, lihat Jika saya dapat membaca beberapa informasi tentang kesalahan koneksi jaringan:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
Pelaksana cuplikan di atas dengan Server dimatikan menghasilkan:
Koneksi WebSocket ke 'wss: // localhost: 8001 /' gagal: Kesalahan dalam pembuatan koneksi: net :: ERR_CONNECTION_REFUSED
Menjalankan cuplikan di atas dengan Server Diaktifkan
Sambungan WebSocket ke 'wss: // localhost: 8001 /' gagal: Handshake pembuka WebSocket dibatalkan
Tetapi sekali lagi, kesalahan bahwa "fungsi onerror" yang dihasilkan ke konsol tidak memiliki tip untuk membedakan satu kesalahan dari yang lain.
Menggunakan proxy sebagai saran jawaban ini dapat bekerja tetapi hanya jika server "target" memiliki akses publik.
Ini tidak terjadi di sini, jadi mencoba menerapkan proxy dalam skenario ini akan membawa Kami ke masalah yang sama.
Kode untuk membuat server HTTPS Node.js :
Saya telah membuat dua server HTTPS Nodejs, yang menggunakan sertifikat yang ditandatangani sendiri:
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);
Untuk membuatnya bekerja, Anda harus memiliki Nodejs Terinstal, Perlu membuat sertifikat terpisah untuk setiap server dan menyimpannya di folder certs dan certs2 yang sesuai.
Untuk menjalankannya cukup jalankan node applicationServer.js
dan node targetServer.js
di terminal (contoh ubuntu).