WebSocketServer - Auf ein mal ein Problem beim Client

Alle Fragen zur Netzwerkkommunikation
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von pluto »

Die Fehlermeldung in Google-WebBrowser lautet:
WebSocket connection to 'ws://10.10.10.10:8080/' failed: Error during WebSocket handshake: Error in permessage-deflate: client_max_window_bits must have value

Eine Suche im Internet hilft auch wenig. Jedenfalls bisher.

Ich habe nach "failed: Error during WebSocket handshake: Error in permessage-deflate" gesucht.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von pluto »

Problem gelöst, so wie es aussieht: Es lag an den
"Sec-WebSocket-Extensions" warum auch immer. In der Datei WebSocket2.pas An Code Stelle 927 einfach diese Zeile raus nehmen und es sollte wieder gehen:
s := s + 'Sec-WebSocket-Extensions: ' + fncExtensions + #13#10;
MFG
Michael Springwald

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von Antrepolit »

pluto hat geschrieben:Problem gelöst, so wie es aussieht: Es lag an den
"Sec-WebSocket-Extensions" warum auch immer. In der Datei WebSocket2.pas An Code Stelle 927 einfach diese Zeile raus nehmen und es sollte wieder gehen:
s := s + 'Sec-WebSocket-Extensions: ' + fncExtensions + #13#10;

Von wem ist denn die Unit? Diese eine Zeile Code bringt mich schon fast zum heulen, das sieht echt furchbar aus. Wozu gibt es Konstanten, die ein Zeilenende definieren?
Grüße, Antrepolit

care only if your os is really burning

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von pluto »

Vom wem die Unit genau ist weiß ich nicht. Die Unit nennt sich jedenfalls BauglirWebSocket2.
Stimmt, dass mit der LineEnd Zeichen könnte man einfügen. Spielt aber erst mal keine Große Rolle.

Ich bin nur froh das es wieder läuft.
MFG
Michael Springwald

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von gocher »

Antrepolit hat geschrieben:Von wem ist denn die Unit? Diese eine Zeile Code bringt mich schon fast zum heulen, das sieht echt furchbar aus. Wozu gibt es Konstanten, die ein Zeilenende definieren?

Welche Konstante würdest Du denn nutzen?
pluto hat geschrieben:Vom wem die Unit genau ist weiß ich nicht. Die Unit nennt sich jedenfalls BauglirWebSocket2.
Stimmt, dass mit der LineEnd Zeichen könnte man einfügen. Spielt aber erst mal keine Große Rolle.

LineEnding?
Line feed (LF, #10 ): Linux, OS X, BSDs, Unix
Carriage return + Line feed (CRLF, #13#10): Microsoft Windows
Carriage return (CR, #13): Mac OS Classic

Zur Info im HTTP Header ist Carriage return + Line feed (CRLF, #13#10) angesagt, egal welches System!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von gocher »

Der Fehler in der Komponente liegt wohl darin das in der Funktion TWebSocketServer.CreateServerConnection der Request Header Wert von Sec-WebSocket-Extensions ausgelesen wird und im Response Header dieser Wert zurückgeschickt wird. Ich habe allerdings im Code keine Stelle gefunden wo der Wert überprüft wird und die Daten auch dem Wert entsprechend behandelt wird bzw. die Übertragung.

Beispiel:
GET /socket HTTP/1.1
Upgrade: websocket
Sec-WebSocket-Key: ...
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits; server_max_window_bits=10
Der Client fragt was der Server unterstützt?

HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Sec-WebSocket-Accept: ...
Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=10
Der Server unterstützt/bestätigt in diesem Beispiel server_max_window_bits=10 .

Die genutzte Serverkomponente unterstützt allerdings nichts der gleichen, also darf sie auch nichts bestätigen bis es nicht realisiert ist.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von pluto »

Zur Info im HTTP Header ist Carriage return + Line feed (CRLF, #13#10) angesagt, egal welches System!

Danke für die Info, dann würde ich mir eine eigene dafür Definieren.

Die genutzte Serverkomponente unterstützt allerdings nichts der gleichen, also darf sie auch nichts bestätigen bis es nicht realisiert ist.

Aha, sowas habe ich mir gedacht, also ist meine Lösung mit dem nicht Senden von der:
Sec-WebSocket-Extensions
richtig.
Aber warum klappte dies unter der FireFox Version 30.0? Unterstütze diese Version vielleicht noch nicht Sec-WebSocket-Extensions?
MFG
Michael Springwald

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von gocher »

Am Einfachsten schaust du dir einfach die Kommunikation (Client-Server) an.
Die "developer tools" (Schraubenschlüssel) würde ich mir als Entwickler immer griffbereit in die Toolbar ziehen, zu beginn findest du sie im Hamburger-Menü (drei horizontale Balken).
Developer tools
Developer tools

Sonst gibt es auch noch eine schöne Extension: Live HTTP Headers https://addons.mozilla.org/de/firefox/addon/live-http-headers/
Da jede WebSocket Verbindung mit einem HTTP - Request beginnt bekommst du dort alle Informationen die die Kommunikation betreffen.
Wenn du verfolgs was der Browser sendet weißt du was er kann, wenn der Server einfach nur bestätigt und es eigentlich nicht unterstützt führt es logischer Weise zu Fehlern.
In deinem Fall gehe ich davon aus das der Firefox eine Optimierung der Komprimierung anbietet und der Server sagt einfach er kann es, so schickt dann der Firefox die Daten optimiert und dein Server versteht nur Bahnhof.
Bei einer Server-Komponenten-Entwicklung die auf ein Protokoll aufsetzt welches immer wieder erweitert wird sollte man eigentlich eine genauere Überprüfung der Werte vornehmen und nur das beantworten was man bereits unterstützt, einfach den Header-Wert des Requests in den Header des Response zu kopieren macht gerade hier keinen Sinn. Dann lieber nicht bestätigen und auf den kleineren gemeinsamen Nenner treffen.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von pluto »

Die "developer tools" (Schraubenschlüssel) würde ich mir als Entwickler immer griffbereit in die Toolbar ziehen, zu beginn findest du sie im Hamburger-Menü (drei horizontale Balken).

Ich habe z .b. Firebug Ich habe Werkzeuge ein ausblenden. Aber ein Schraubenzieher Icon sehe ich nicht.
Der Werkzeugkasten sieht Interessant aus. Die Konsole nutzte ich bereits, da man sonst keine Fehlermeldungen enthält.

Danke für die Wertvollen Tipps und Hinweise.

Sonst gibt es auch noch eine schöne Extension: Live HTTP Headers

Habe ich mir Installiert.

n deinem Fall gehe ich davon aus das der Firefox eine Optimierung der Komprimierung anbietet und der Server sagt einfach er kann es, so schickt dann der Firefox die Daten optimiert und dein Server versteht nur Bahnhof.

Ja, sowas habe ich mir auch irgendwie gedacht. Vielleicht unterstütze FireFox 30.0 das noch nicht aber 37.0 schon.

Bei einer Server-Komponenten-Entwicklung die auf ein Protokoll aufsetzt welches immer wieder erweitert wird sollte man eigentlich eine genauere Überprüfung der Werte vornehmen und nur das beantworten was man bereits unterstützt, einfach den Header-Wert des Requests in den Header des Response zu kopieren macht gerade hier keinen Sinn. Dann lieber nicht bestätigen und auf den kleineren gemeinsamen Nenner treffen.

Nun, der Teil vom Code stammt nicht von mir sondern aus einen Beispiel, welches ich genommen habe.

Aber so müsste es jetzt auch für die Zukunft erst mal richtig sein:

Code: Alles auswählen

 
 
              s :=        'HTTP/1.1 101 Switching Protocols' + #13#10;
              s:=s+'Content-type: Text/Html;charset=ISO-8859-1'+#13#10;
 
              s := s +    'Upgrade: websocket' + #13#10;
 
              s := s +    'Connection: Upgrade' + #13#10;
              s := s +    'Sec-WebSocket-Accept: ' + key + #13#10;
              s:=s+'dnt=1' + #13#10;
              if (fncProtocol <> '-') then
              begin                                                                         
 

Wobei den Charset könnte ich noch Ändern zu UTF-8
hie
MFG
Michael Springwald

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: WebSocketServer - Auf ein mal ein Problem beim Client

Beitrag von gocher »

pluto hat geschrieben:Ich habe z .b. Firebug Ich habe Werkzeuge ein ausblenden. Aber ein Schraubenzieher Icon sehe ich nicht.
Der Werkzeugkasten sieht Interessant aus. Die Konsole nutzte ich bereits, da man sonst keine Fehlermeldungen enthält.

Firebug kann das auch, im Reiter Net. :oops:
Firebug
Firebug

dnt=1 => Do Not Track (dt. Verfolge [mich] nicht), als Antwort vom Server finde ich auch interessant, auf die Idee zu kommen das ein Client den Server trackt (wahrscheinlich für Google Chrome :shock: )

Ich nutze z.Z. die Firefox Developer Edition: https://www.mozilla.org/de/firefox/developer/
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten