FHEMWEB und connection: 'keep-alive'

Begonnen von derkallevombau, 07 Februar 2021, 22:59:09

Vorheriges Thema - Nächstes Thema

derkallevombau

Wenn ich per Node.js https.request() einen GET-Request ohne 'cmd'-Parameter an FHEMWEB schicke, um das CSRF-Token zu erhalten, bleibt der verwendete TCP-Socket nach Empfang der Antwort erhalten.

Wenn ich nun aber weitere GET-Requests mit den Parametern 'cmd' und 'fwcsrf' schicke, wird – anstatt den bestehenden Socket zu benutzen – stets ein neuer Socket mit einem anderen Port erzeugt, welcher sofort nach erhalt der Antwort geschlossen wird.

Knapp zwei Minuten nach dem letzten Request beendet FHEMWEB die Verbindung zu dem zuerst erzeugten Socket, wodurch dieser geschlossen wird. Das bedeutet, dass die Node.js-Anwendung noch knapp zwei Minuten weiterläuft, obwohl sie nichts mehr zu tun hat.

Das passiert übrigens auch, wenn ich den Header { connection: 'close' } sende, m. a. W., FHEMWEB scheint den connection-Header vollkommen zu ignorieren.

Die einzige Möglichkeit, zu erreichen, dass die Anwendung sofort geschlossen wird, ist die Verwendung eines eigenen https.Agent und der Aufruf von Agent.destroy() am Ende des Programms.

Andererseits hat FHEMWEB das Attribut 'closeConn': "If set, a TCP Connection will only serve one HTTP request". Daraus folgt, dass keep-alive sehr wohl unterstützt werden sollte.

Ich bin hier mit meinem Latein am Ende. Hat jemand eine Idee, was da schief läuft?

rudolfkoenig

ZitatFHEMWEB scheint den connection-Header vollkommen zu ignorieren.
Das ist erstens nicht ganz richtig (Connection:Upgrade wird ausgewertet), und zweitens wird laut RFC auch nicht gefordert.

In der RFC steht:
ZitatThe "close" connection option is defined for a sender to signal that
   this connection will be closed after completion of the response.  For
   example,

     Connection: close

   in either the request or the response header fields indicates that
   the sender is going to close the connection after the current
   request/response is complete (Section 6.6).
D.h. wer auch immer diese Headerzeile setzt, schliesst die Verbindung.

Schliessen einer Verbindung ist meiner Ansicht nach Aufgabe des Clients, der Server (FHEMWEB) macht das nur, damit "schlampig" programmierte Clients den Server nicht verstopfen. Sozusagen geht der Kunde aus dem Laden freiwillig und wird nicht rausgeschmissen.

Das closeConn Attribut bewirkt, dass die nicht-longpoll Verbindungen von FHEM sofort geschlossen werden. Die Voreinstellung ist 1 fuer iOS, sonst 0. Das Attribut wurde eingefuehrt, um Probleme mit iOS Clients zu loesen.
Nicht-longpoll Verbindungen werden nach eine Minute Inaktivitaet geschlossen, das wird einmal die Minute geprueft.