FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Markus Bloch am 31 Mai 2014, 19:01:02

Titel: [PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Markus Bloch am 31 Mai 2014, 19:01:02
Hallo Rudi,

anbei findest du einen sehr kleinen Patch für HttpUtils.pm:


Der erste Punkt dient der Auswertung des Statuscodes in Fällen ungleich 200 (also 401,403,404, ...). LG-TV's geben die Rückmeldung der Anfrage nur in Form von HTTP Statuscodes ohne weiteren Content an ("Content-Length: 0", siehe Diskussion mit betateilchen bei meinem letzten Fragethread).

Der zweite Punkt schmerzt dir, dass weis ich. Leider antwortet mir in meinem Fall mein LGTV erst dann, wenn HTTP/1.1 in der Request-Line steht. Bei HTTP/1.0 beendet der Server (LGTV) sofort die Verbindung. Da es im Internet mittlerweile defacto Standard ist, sehe ich persönlich hier keine Probleme HTTP/1.1 zu verwenden. Alle Module in meiner FHEM Installation die HttpUtils.pm verwenden funktionieren nachwievor ohne Probleme mit HTTP/1.1 (Weather, Twilight, YAMAHA_*)

Währe toll, wenn das eingecheckt werden könnte.

Vielen Dank

Gruß
Markus
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: rudolfkoenig am 01 Juni 2014, 13:57:15
Hallo Markus,

du hast recht, ueber den HTTP/1.1 bin ich nicht gluecklich, da ich nicht sicher bin, welche Seiteneffekte es hat. Weiterhin bin ich nicht ganz sicher, welche Header-Felder bei 1.1 spezifiziert werden muessen, aus dem RFC werde ich nicht ganz schlau. Ich habe aber beschlossen, dass wir dies durch die fleissigen FHEM-Tester rausfinden werden, insofern habe ich beide Aenderungen eingecheckt. Falls jemandem was auffaellt, bitte hier melden.

Gruss,
  Rudi
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Markus Bloch am 01 Juni 2014, 14:05:54
Vielen Dank.

Eine wesentliche Neuerung in HTTP/1.1 ist die Möglichkeit eine TCP Verbindung offen zuhalten um mehrere HTTP-Requests abzusetzen (Header-Feld: Keep-Alive). Daher würde ich vorschlagen die Zeile

Connection: Close

Generell mit aufzunehmen, da HttpUtils.pm aktuell nicht im Stande ist, eine TCP Verbindung offen zu halten für weitere Requests.

Alle HTTP Module bei mir funktionieren aber auch ohne dieser Zeile mit HTTP/1.1

Gruß

Markus
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: betateilchen am 02 Juni 2014, 18:27:51
Zitat von: rudolfkoenig am 01 Juni 2014, 13:57:15
du hast recht, ueber den HTTP/1.1 bin ich nicht gluecklich, da ich nicht sicher bin, welche Seiteneffekte es hat.
...
Falls jemandem was auffaellt, bitte hier melden.

*meld*

Mit dem geänderten Modul HttpUtils funktionieren die Kalender in 57_Calender wieder mal nicht mehr.

(Ja ich habe ausführlich getestet, es ist das aktualisierte Modul HttpUtils.pm, nicht das zeitgleich geänderte 57_Calendar.pm)

Und ich bin nicht der einzige mit dem Problem:

http://forum.fhem.de/index.php/topic,24090.msg173619.html#msg173619
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: betateilchen am 02 Juni 2014, 20:13:36
Zitat von: Markus Bloch am 01 Juni 2014, 14:05:54
Daher würde ich vorschlagen die Zeile
Connection: Close
Generell mit aufzunehmen,
Alle HTTP Module bei mir funktionieren aber auch ohne dieser Zeile mit HTTP/1.1

"Wir befinden uns im Jahre 2014 n.Chr. Ganz fhem ist von HttpUtils.pm besetzt... Ganz fhem? Nein! Ein von unbeugsamen Entwicklern gebautes Modul hört nicht auf, dem Eindringling Widerstand zu leisten."

Wenn man die von Markus vorgeschlagene zusätzliche Header-Zeile mit in die HttpUtils aufnimmt, funktioniert auch das Calendar-Modul wieder korrekt.


Index: HttpUtils.pm
===================================================================
--- HttpUtils.pm (revision 6033)
+++ HttpUtils.pm (working copy)
@@ -190,6 +190,7 @@

   my $hdr = "$method $hash->{path} HTTP/1.1\r\n";
   $hdr .= "Host: $hash->{host}\r\n";
+  $hdr .= "Connection: Close\r\n";
   $hdr .= "Authorization: Basic $hash->{auth}\r\n" if(defined($hash->{auth}));
   $hdr .= $hash->{header}."\r\n" if(defined($hash->{header}));
   if(defined($data)) {
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: rudolfkoenig am 03 Juni 2014, 10:01:15
Eingecheckt.
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: betateilchen am 03 Juni 2014, 10:03:09
Danke.
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Loredo am 04 Juni 2014, 13:11:44
Hi,


nach dem Update scheint etwas nicht mehr so ganz in Ordnung zu sein, so dass das ENIGMA2 Modul nicht mehr funktioniert.



2014.06.04 13:06:14 5: ENIGMA2 LR_SAT: RES ERROR powerstate - not in XML format
6a
<?xml version="1.0" encoding="UTF-8"?>
<e2powerstate>
   <e2instandby>
false   </e2instandby>
</e2powerstate>


0







Irgendwie mogelt sich da also am Anfang ein "6a" und am Ende eine "0" dazu.
Hier ist die Codestelle, an die HtmlUtils die $data Variable übergibt:
http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/FHEM/70_ENIGMA2.pm#l937 (http://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/FHEM/70_ENIGMA2.pm#l937)


Ich sehe keinen Zusammenhang zu meinem Code. Weiß jemand, was in HttpUtils falsch läuft?




Gruß
Julian
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: rudolfkoenig am 04 Juni 2014, 13:32:03
Zitatnach dem Update

Update von heute?
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Loredo am 04 Juni 2014, 13:34:56
Zitat von: rudolfkoenig am 04 Juni 2014, 13:32:03
Update von heute?


Update heute durchgeführt, somit die Änderungen von gestern in HttpUtils eingeschlossen.
Das Problem besteht aber wohl bereits seit 2.6. (sprich dem Checkin 01.06.14 13:50).
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: rudolfkoenig am 04 Juni 2014, 13:48:15
Und falls Du HTTP/1.1 wieder in HTTP/1.0 aenderst?
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Loredo am 04 Juni 2014, 17:23:25
Dann geht es wieder und die Rückmeldung sieht so aus:


2014.06.04 17:22:45 5: ENIGMA2 LR_SAT: RES powerstate
<?xml version="1.0" encoding="UTF-8"?>
<e2powerstate>
<e2instandby>
false </e2instandby>
</e2powerstate>


Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Markus Bloch am 04 Juni 2014, 17:37:10
Könntest du evtl. mal einen PCAP in Wireshark mit HTTP/1.1 machen und mir oder dem Thread zur Verfügung stellen?

Vielen Dank

Gruß
Markus
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Loredo am 05 Juni 2014, 10:05:47
Na klar ;-)
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: rudolfkoenig am 05 Juni 2014, 10:08:49
Da scheinbar manche Benutzer Probleme mit HTTP/1.1 haben (selbst mit Connection:Close), habe ich die Voreinstellung wieder auf 1.0 gesetzt. Man (d.h. der Modulautor) kann sie mit $hash->{httpversion}="1.1" selbst bestimmen, in diesem Fall wird auch automatisch "Connection: Close" zum Header hinzugefuegt.

Auf ein Neues beim testen.
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: betateilchen am 05 Juni 2014, 12:54:11
Calendar funktioniert.
Titel: Antw:[PATCH] - HttpUtils - Rückgabe des Status-Codes in $param, senden in HTTP/1.1
Beitrag von: Loredo am 06 Juni 2014, 10:50:47
Ja, ENIGMA2 funktioniert so auch.
Vielleicht finden wir den Unterschied zwischen http 1.0 und 1.1 ja noch irgendwie heraus.