Aggiunta di intestazioni HTTP al plugin in sviluppo

Situazione:

Sto sviluppando un plugin e sto utilizzando nginx come reverse proxy per rails:3000; tutto funziona benissimo, ma ho problemi nell’accesso all’API a causa dei temuti errori CORS, che tutti conosciamo e “amiamo”:

Access to XMLHttpRequest at 'blah blah blah' from origin 'foo bar bing' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Finora ho provato ad aggiungere gli header a nginx, ma per qualche motivo questi non compaiono negli header quando faccio il debug su Chrome.

Ho anche provato a usare nginx per modificare i proxy_headers da rails a nginx, ma senza successo.

Inoltre, ho provato a usare un’estensione di Chrome per inserire gli header, ma nemmeno questo sembra funzionare, anche se un test CORS del browser tramite un sito di test CORS mostra che tutto è consentito.

Poi ho provato ad aggiungere il gem rack-cors, ma non sono riuscito a far funzionare config.middleware a causa di errori freeze.

Questo sta bloccando lo sviluppo e sembra che abbia imboccato un vicolo cieco :frowning:

Esiste un modo per aggiungere direttamente questi header in Discourse, in un file di configurazione (o meglio ancora nel plugin), che invii i vari header HTTP che vogliamo testare e inviare nell’ambiente di sviluppo?

Oppure è possibile far funzionare il gem rack-cors? Se sì, dove nel plugin dovrei aggiungere il codice?

Rif: RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

Come accennato, le (molte) cose che ho provato finora e quanto riportato su rubydocs si traducono tutti in “non funziona qui”, sempre la stessa storia.

Ho persino provato a dimenticare per il momento i problemi CORS e ho semplicemente aggiunto un singolo header di cache HTTP, ma anche questo si è rivelato un vicolo cieco, dal mio punto di vista.

Immagino che tutti ridano di questi problemi legati a CORS, e anch’io; ma se poteste condividere con me come aggiungere i miei header di test (CORS o meno) mentre sono nell’ambiente di test di sviluppo, ve ne sarei molto grato.

Grazie.

C’è un motivo per cui il nostro supporto CORS standard e l’impostazione del sito cors_origins non funzionano per te?

Ciao @sam,

Non so perché il supporto CORS integrato non funzioni per me, ma ho provato molte voci, inclusi questi tipi di voci wild-card. Forse lo sto facendo male?

Scusa, l’ho menzionato nell’OP…

Forse devo impostare questa variabile d’ambiente?

  if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
    return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
  end

Devo impostare delle variabili d’ambiente? Se sì, dove? Forse è questo il mio errore?

Grazie!

Per tua informazione, ho impostato questo nell’inizializzatore del plugin:

Discourse.SiteSettings.discourse_enable_cors = true;
Discourse.SiteSettings.discourse_cors_origin = "*";

e console.log mostra che queste impostazioni sono corrette… ma il temuto “access denied” rimane ancora nella console :frowning: