in questi giorni sto creando un Client Javascript (in AngularJS) che va
a
chiamare delle API REST. Per aggirare le limitazioni ‘same origin
policy’
sfrutto CORS http://www.html5rocks.com/en/tutorials/cors/.
In locale tutto va bene. Senza andare in dettaglio, quando viene fatta
una
request usando CORS, prima della request vera e propria viene fatta una
request con il verbo OPTIONS per vedere se il dominio da cui parte la
request sicuro.
Al momento le API REST girano su Heroku e mi trovo davanti ad un
problema.
La request con il verbo OPTIONS viene fatta senza l’header
Content-Length.
Questo fa si che Heroku mi ritorni un errore 411 (Length Required),
perch
richiede l’header Content-Length. Per ragione di sicurezza, questo
header
non si pu settato con Javascript.
Ora, o mi sto perdendo qualcosa (molto probabile) o mi trovo costretto
ad
abbandonare Heroku. Ho fatto qualche ricerca, ma nessun risultato.
Chiedo
quindi a voi se avete qualche idea a riguardo e soprattutto, nel caso in
cui non fosse risolvibile, a qualche alternativa hosting passereste.
e avvii le due istanze delle app ruby in localhost?
Questo è il servizio al quale voglio accedere.
angular.js:9120
Heroku. Per caso avete del codice client di esempio?
Domanda forse banale: sei sicuro che ti serva il preflight?
Se devi effettuare delle semplici GET (tramite $.ajax ad esempio) allora
il
preflight non dovrebbe servirti [0].
Qualora il preflight dovesse comunque servirti, hai provato a testare
manualmente il funzionamento di una semplice GET Ajax?
e avvii le due istanze delle app ruby in localhost?
No. Quando accedo in localhost tutto ok e uso indirizzi locali, mentre http://api.lelylan.com/devices un servizio attualmente attivo su Heroku
che si pu verificare gi ora.
Domanda forse banale: sei sicuro che ti serva il preflight?
Se devi effettuare delle semplici GET (tramite $.ajax ad esempio) allora il
preflight non dovrebbe servirti [0].
Qualora il preflight dovesse comunque servirti, hai provato a testare
manualmente il funzionamento di una semplice GET Ajax?
Ho provato a fare quanto dici. Ho buttato gi del codice di base per
verificare la cosa
var invocation = new XMLHttpRequest();
var url = 'http://api.lelylan.com/devices';
var body = {};
invocation.open('POST', url, true);
invocation.setRequestHeader('Content-Type', 'application/json');
invocation.onreadystatechange = function() { console.log('Response')
};
invocation.send(body);
Questo codice di esempio fa un preflight e mi ritorna un errore 411.
Questo
errore
dato sia da Chrome che da Firefox, mentre Safari funziona. Suppongo che
le
implementazioni di XMLHttpRequest siano differenti e che Safari setti il
content
length durante il preflight.
La configurazione è piuttosto semplice e per adesso abilito le richieste
che arrivano
da qualsiasi host. In locale infatti tutto funziona.
Questo è il servizio al quale voglio accedere.
http://api.lelylan.com/devices
Se lo mettete su un browser mi restituisce un 401, il che è corretto in
quanto manca
il token di autorizzazione. Se invece provo a fare la chiamata
attraverso
JS (Angular)
il browser, invia la request OPTION in auto e mi restituisce un 411.
Da quello che ho visto Heroku risponde
cosìhttp://http-status.heroku.com/411perchè manca l’header
Content-Length.
Quindi, non riesce manco a raggiungerla l’app.
Adesso provo a capire se è Angular a mancare qualcosa. Quello che volevo
avere era
una conferma da voi che con dei client JS riuscite a raggiungere dei
servizi esposti da
Heroku. Per caso avete del codice client di esempio?
Ho la sensazione che sia proprio un problema di impostazioni del web
server… qui [0] hanno risolto catchando direttamente su nginx le
richieste
e restituendo a prescindere un 200.
Non e’ il massimo pero’, e nel caso di Heroku mi pare impraticabile.
Curiosita’ 1: con le chiamate GET semplici non ti viene generato un
preflight, e’ corretto?
Curiosita’ 2:
Per ragione di sicurezza, questo header non si può settato con
Javascript.
Non centra molto ma guarda la libreria easyxdm per fare cors con gli
iframe
e il crossdomain
Il giorno 13/feb/2013 10:18, “Andrea R.” [email protected]
ha scritto:
Temo di aver trovato il problema: la tua app che non ritorna
content-length.
Verifica dal log se viene chiamata realmente, dovrebbe, e non credo
inserisca l’header Content-Length.
Al momento uso Stack Cedar sia sul proxy fatto con Node.js
(api.lelylan.com)
che sul
servizio vero e proprio fatto con Rails (devices.lelylan.com). Da come
si
pu vedere
dalle requests ritorna nginx come server (tutti e due). Non normale?
Non
sei il primo
che mi pone questa domanda.
Ho fatto qualche test in pi ed in qualche modo la cosa si sta chiarendo.
Se faccio le mie
calls alle API fatte con Rails (devices.lelylan.com) tutto funziona
bene. I
problemi ci sono
nel momento in cui passo per il Proxy fatto con Node
Proxyhttps://github.com/nodejitsu/node-http-proxy
(api.lelylan.com), quindi il
problema si sposta.
Lo uso anche io e non mi ha mai dato problemi :(,
per non l’ho mai usato per CORS.
Prova a fare lo stesso setup in locale e vedi se ti d gli stessi
problemi.
Nginx. Non normale? Non sei il primo che mi pone questa domanda.
Secondo me no.
Why not?
Lo uso anche io e non mi ha mai dato problemi :(,
per non l’ho mai usato per CORS.
Prova a fare lo stesso setup in locale e vedi se ti d gli stessi problemi.
In locale funziona tutto bene. In produzione pure funziona bene. Mi da
problemi solo
con CORS per adesso.
Nginx. Non normale? Non sei il primo che mi pone questa domanda.
Secondo me no.
Why not?
Citando testualmente:
“Since requests to Cedar apps are made directly to the application
server not proxied through an HTTP server like nginx any compression of
responses must be done within your application.”
Lo uso anche io e non mi ha mai dato problemi :(,
per non l’ho mai usato per CORS.
Prova a fare lo stesso setup in locale e vedi se ti d gli stessi
problemi.
In locale funziona tutto bene. In produzione pure funziona bene. Mi da
problemi solo
con CORS per adesso.
Ho un node-http-proxy in produzione anche io, eccoti una traccia HTTP.
Sembra che per OPTIONS non trasmetta Content-Length, come in generale
per tutte le risposte “a body vuoto”.
E’ un bug suo.
Esempio dalla ia macchina linode (con node-http-proxy):