[Gelöst] Bad Request cmd={localtime}

Begonnen von Thorsten Pferdekaemper, 24 Januar 2019, 16:04:18

Vorheriges Thema - Nächstes Thema

Thorsten Pferdekaemper

Hi,
wenn ich FTUI an ein "entferntes" FHEM ankopple (mit meta fhemweb_url), dann bekomme ich recht häufig (aber nicht immer) die Meldung "Bad Request cmd={localtime}". Ich gehe momentan davon aus, dass das am csrf-Token hängt. Mit "meta debug 1" und der Browser-Konsole sehe ich normalerweise:

Finished load plugin "link" for area "html"
Got csrf from FHEM:csrf_344033286181534
Try to init plugin: clock
init widget: name=clock area=html
send to FHEM: {localtime}
Finished load plugin "clock" for area "html"

D.h. der csrf-Token wird ermittelt bevor das clock Widget initialisiert wird.
Im Fehlerfall sieht das dann mitunter so aus:

Finished load plugin "link" for area "html"
Try to init plugin: clock
init widget: name=clock area=html
send to FHEM: {localtime}
Finished load plugin "clock" for area "html"
Try to init plugin: label
[...]
initPage (html): in 247ms
websockets URL=ws://192.168.178.165:8086/fhem?XHR=1&inform=type=status;filter=WEB,og_wg_Heizung_Clima,og_wg_RollladenLi,og_wg_RollladenRe,og_wg_Lampe01,og_wg_Lampe12,og_wg_Thermostat_Climate, STATE longpoll desired-temp measured-temp level setList ValvePosition humidity;since=1548341546453;fmt=JSON&timestamp=1548341546463
GET http://192.168.178.165:8086/fhem?cmd=%7Blocaltime%7D&XHR=1&_=1548341546120 400 (Bad Request)
GET http://192.168.178.165:8086/fhem?cmd=%7Blocaltime%7D&XHR=1&_=1548341546119 400 (Bad Request)
Got csrf from FHEM:csrf_344033286181534
GET http://192.168.178.165:8086/fhem?cmd=list%20og_wg_RollladenLiTimer&XHR=1&_=1548341546121 400 (Bad Request)

D.h. der csrf-Token kommt viel später zurück und ist daher beim Ajax-Aufruf im Clock-Init noch nicht vorhanden.
Man sieht oben auch, dass das Problem manchmal (bei mir seltener) auch bei anderen Widgets auftritt, die in der Initialisierung einen FHEM-Aufruf haben.
Könnte man das so ändern, dass die Initialisierung der Widgets erst dann startet, wenn das csrf-Token ermittelt wurde?
...oder sollte das in den Widgets selbst passieren? In dem Fall bräuchte man eine sichere Bedingung, die sagt, ob das Token schon ermittelt wurde.
Gruß,
    Thorsten
FUIP

Tommy82

Fhem Cubitruck  Armbian Buster with Linux 5.3.9-sunxi
HM-CC_RT-DN, HM-Sec-RHS,HM-Sec-SD, HM-Sec-SCo,IT1500,1xIT GRR-3500 Fritz!Dect200,Powerline546E,Enigma2 Modul mit 3 Vu+,Wol Modul für WinServer2016 und WinServer 2019,FB6590
Allnetl Wandtablett mit FTUI

setstate

Ich habe die Abarbeitung initPage und getCSrf jetzt optimiert. initPage wird erst aufgerufen, wenn auch getCSrf fertig ist.

Thorsten Pferdekaemper

Hi,
danke, aber es passiert bei mir immer noch, trotz:

2019.01.26 14:59:52 1 : fhemtabletui
2019.01.26 14:59:53 1 : UPD www/tablet/js/widget_chart.js
2019.01.26 14:59:55 1 : UPD www/tablet/js/fhem-tablet-ui.min.js
2019.01.26 14:59:55 1 : UPD www/tablet/js/widget_clock.js
2019.01.26 14:59:55 1 : UPD www/tablet/js/fhem-tablet-ui.js
2019.01.26 14:59:56 1 : UPD www/tablet/lib/weather-icons-wind.min.css

Ich werde mal wieder forschen...
Gruß,
   Thorsten
FUIP

setstate


Thorsten Pferdekaemper

Zitat von: setstate am 26 Januar 2019, 15:06:49
Browser Cache gelöscht?
Ja, und mich per Javascript-Debugger davon überzeugt, dass Deine neue Version benutzt wird.

Ich glaube, dass das Problem hier liegt:

      // init Page after css is ready and CSFS Token has been retrieved
        $.when(initDeferreds).done(function () {
            ftui.loadStyleSchema();
            ftui.initPage();
        });

Ich gehe davon aus, dass die Methode "when" ein Array als einen einzelnen Parameter betrachtet. Ich denke, dass dann folgendes zutrifft:
Zitat
If a single argument is passed to jQuery.when() and it is not a Deferred or a Promise, it will be treated as a resolved Deferred and any doneCallbacks attached will be executed immediately.
D.h. das Ding wartet nicht wirklich. Ich glaube, so würde es gehen:

      // init Page after css is ready and CSFS Token has been retrieved
        $.when.apply($,initDeferreds).done(function () {
            ftui.loadStyleSchema();
            ftui.initPage();
        });

...es scheint außer dem "apply" auch noch den "Spread Operator" (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Spread_syntax) zu geben, aber dann haben IE-Nutzer wohl Pech gehabt.
Gruß,
   Thorsten
FUIP

setstate

#6
Hast Recht, sieht stark danach aus.
So wollte ich es auch machen. (siehe Zeile 873, dort funktioniert es ja)

Ändere ich sofort.

Es muss immer erst ein
[Log] Got csrf from FHEM:null
kommen, dann das
[Log] initPage - area=html

Thorsten Pferdekaemper

Hi,
jetzt scheint es tatsächlich erledigt zu sein.
Jetzt brauchen die Widgets manchmal zwei Sekunden oder so, bis sie erscheinen. Das ist aber besser als die Fehlermeldung. ...außerdem locker erklärbar mit meinem manchmal leicht überlasteten RasPi 1 als Back-End. Die Zbox BI329 liegt schon neben mir.
Danke&Gruß,
   Thorsten
FUIP