6

Mam następujący kod w BACKGROUND_SCRIPT w rozszerzenie Google Chrome:Co powoduje, że EventSource powoduje błąd w moim rozszerzeniu Chrome?

var source = new EventSource("http://www.janywer.freetzi.com/events/groupshout.php"); 
source.addEventListener('message', function (e) { 
    console.log('message', e.data); 
}, false); 
source.addEventListener('open', function (e) { 
    console.log('open'); 
}, false); 
source.addEventListener('error', function (e) { 
    console.log('error') 
}, false); 

Mój problem jest następujący: Ilekroć załadować rozszerzenie, to mówi „błąd”, ale w jaki sposób mogę się dowiedzieć, co dokładnie spowodowało błąd?

Odpowiedz

6

The specification definiuje tylko kilka możliwych przypadków za „błąd” zdarzenie zostało wyzwolone, którymi są:

  • cross-origin wniosek został zainicjowany, ale oczekiwane nagłówki Cors nie zostały otrzymane. Obejmuje to:
    • Access-Control-Allow-Origin nie jest ustawiony lub nie jest zgodny z początkowym adresem URL.
    • Ustawiono withCredentials:true (za pomocą drugiego parametru EventSource), ale serwer nie odpowiedział z Access-Control-Allow-Credentials: true.
  • Wystąpił błąd sieci.
  • Stan http nie wynosi 200, 305, 401, 407, 301, 302, 303 lub 307.
  • Agent użytkownika (przeglądarka) próbuje przywrócić połączenie.
  • Status http to 200, ale nagłówek odpowiedzi Content-Type nie jest tekstem/strumieniem zdarzeń.
  • Nastąpiło przekierowanie, które spowodowało jeden z poprzednich warunków.

Gdy wystąpi błąd CORS, Chrome zwykle zalogować się następujący komunikat w konsoli:

EventSource nie może załadować http://example.com/eventsource. Pochodzenie http://origin.example.com jest niedozwolone przez Access-Control-Allow-Origin.

Z jakiegoś powodu Chrome nie wyświetla tego błędu po przekierowaniu.


Prawdopodobnie dodał pozwolenie "http://www.janywer.freetzi.com/*" do pliku manifestu, powodując początkowe żądania do przekazania. Ta strona przekierowuje do innej domeny (bez prefiksu www). Prawdopodobnie nie dodałeś tej domeny do pliku manifestu, więc Chrome podejmuje próbę włączenia żądania CORS. Oczekiwane nagłówki nie są odbierane, więc Chrome przerwie żądanie.

Problem ten można rozwiązać na dwa sposoby:

  • Dodaj wszystkich zaangażowanych domen do pliku, np

    "permissions": [ 
        "http://www.janywer.freetzi.com/*", 
        "http://janywer.freetzi.com/*" 
    ] 
    

    (patrz match patterns w dokumentacji rozszerzenia Chrome)

  • lub pozwolić na odpowiedź serwera z oczekiwanymi nagłówków Cors.W języku PHP:

    header("Access-Control-Allow-Origin: *"); 
    

    Pozwala to dowolnej stronie na dostęp do adresu URL. Aby ograniczyć dostęp tylko do swojego numeru wewnętrznego, użyj:

    header("Access-Control-Allow-Origin: chrome-extension://EXTENSION ID HERE");