Closed sidey79 closed 5 years ago
Ich muss gestehen, der Zugriff via HTTP Head verursacht eine Fehlermeldung im FHEM Log.
019.03.06 22:25:30 3: WEB_127.0.0.1_57071: unsupported HTTP method HEAD, rejecting it.
Leider auch noch mit loglevel 3. Das ist eigentlich quatsch, denn er hat einen http header zurück geliefert.
Einen Fehler hatte ich an der Stelle noch nie und ich will ja, dass es auch ohne csrf Token funktioniert? Ich verstehe den Auslöser für diese Änderung nicht.
Auslöser war, dass ich feststellen wollte ob der Fhemweb Dienst überhaupt läuft. Es gab nur bislang keine Rückmeldung.
Das Umstellen auf die Head Anfrage habe ich gemacht, da uns der Content an dieser Stelle nicht interessiert.
Ich verstehe die Beschreibung der beiden Optionen so als ob es für uns keinen Sinn macht -I zu nutzen. Es liefert das Gleiche aber ausführlicher. To get curl to show detailed information about a single file, you should use -I/--head option. It displays all available info on a single file for HTTP and FTP. The HTTP information is a lot more extensive.
For HTTP, you can get the header information (the same as -I would show) shown before the data by using -i/--include. Curl understands the -D/--dump-header option when getting files from both FTP and HTTP, and it will then store the headers in the specified file.
Wieso kommst Du zu diesem Schluss? Mit -I wird ein http head request gesendet.
Ohne -I wird ein Http Get gemacht. Den brauchen wir doch nicht.
Naja ich bin da nicht so tief drin. Ich dachte aber Option -D macht genau auch diesen Head Request, nur kürzer als -I. -D ist ja nicht -d :)
So habe ich das nicht verstanden. Die -D Option macht einen GET Request und zeigt dir aber nur den Header an. Der Server liefert aber alles aus.
Ich habe beide Varianten nochmal probiert: pi@raspib:~ $ curl -s -D - "$hosturl/fhem?XHR=1" HTTP/1.1 200 OK Content-Length: 0 Cache-Control: no-cache, no-store, must-revalidate X-FHEM-csrfToken: csrf_94953165283244 Content-Type: text/plain; charset=UTF-8
pi@raspib:~ $ curl -Is "$hosturl/fhem?XHR=1" HTTP/1.1 405 Method Not Allowed X-FHEM-csrfToken: csrf_94953165283244 Content-Length: 0
In beiden Fällen ist die Antwort kurz. Content-Length: 0 In beiden Fällen kommt der Token. Im Fall -Is kommt eine Fehlermeldung - das wäre für mich ein k.O. Kriterium. Nicht existierender Webservice bekommt man in beiden Fällen nicht mit. Eine andere Beurteilung fällt mir irgendwie schwer. Ich finde zum Teil widersprüchliche Aussagen und Diskussionen zu dem Thema. Ich kann mich erinnern, die Idee den Token so zu ermitteln kam nicht von mir, das wurde seiner zeit in einem Thread diskutiert und empfohlen.
Wie gesagt. 1. Option ist ein HTTP Get und der liefert 2. Option ein HTTP Head.
Dass FHEM liefert, die Head Option wäre nicht erlaubt. Naja was soll ich dazu sagen. Müsste man in fhemweb patchen, da sie ja sogar den header liefert.
Ich habe das nun nicht nachgeprüft, aber soweit ich das sehe liefert fhem?XHR=1
tatsächlich keinen Inhalt. Also genau das, wozu das HTTP Protokoll die HEAD Methode implementiert hat. Die hat wohl jemand nachgebaut... gruselig :)
Ja wollte ich auch gerade sagen ohne XHR passiert das: pi@raspib:~ $ curl -IXGET "$hosturl/fhem" HTTP/1.1 200 OK Content-Length: 4753 Cache-Control: no-cache, no-store, must-revalidate X-FHEM-csrfToken: csrf_94953165283244 Content-Type: text/html; charset=UTF-8
Naja ob nachgebaut oder einer von vielen Wegen? XHR spricht ja konkret die XML Schnittstelle des Webservices an. Oder besser eine spezielle Programm Schnittstelle. Die liefert dann im Falle FHEMWEB die Header aus.
Ob ich das jetzt richtig gemacht habe? In dem ich meinen Codevorschlag einfach in deinen geschrieben habe? Was wäre die richtige Vorgehensweise gewesen?
Meiner Meinung nach ist das absolut die richtige Vorgehensweise.
Ich finde das auch richtig klasse. :)
Würde ich auch so übernehemen 👍
Nebenbei, gehört aber nicht direkt zu dieser Änderung: Ich habe mir dein Script noch weiter optimiert, da es mir ein paar kleinere Problemchen bereitet hat
curl -s --data "fwcsrf=$token" "$hosturl/fhem?cmd=$cmd&XHR=1"
Get the error code via http head request and return with exitcode 1 if there was an error or no csrf token was provided