http mit Authentifizierung für VLC-Player

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

http mit Authentifizierung für VLC-Player

Beitrag von Sven »

Ich versuche den VLC-Player über das Webinterface fernzusteuern. Dazu habe ich im VLC Passwort und Port festgelegt, das Passwort ist bei neuen Versionen nötig, ein Username wird nicht angegeben.

Aus dem Browser (Firefox) heraus kann ich den VLC jetzt nach folgendem Schema ansprechen:

Code: Alles auswählen

http://127.0.0.1:49161/requests/status.xml?command=pl_play
Daraufhin fragt mich der Browser einmalig nach Username und Passwort, User lasse ich leer, Passwort gebe ich an und bekomme ein XML mit den Statusdaten zurück, der VLC führt den übermittelten Befehl aus.

Jetzt versuche ich das mit Purebasic umzusetzen. Verbindung aufbauen geht auch soweit, aber ich bekomme keine Authentifizierung hin. Einfache Auth nach dem Schema:

Code: Alles auswählen

GET http://:passwort@127.0.0.1:49161/requests/status.xml?command=pl_play
wird nicht akzeptiert, entweder ist das dem VLC zu einfach oder der fehlende Username für dem :passwort macht Probleme. Ich kann aber auch keinen Usernamen im VLC festlegen.

Versuche das mit POST zu authentifizieren werden auch abgelehnt. Ich bekomme nichtmal eine Antwort vom VLC zurück. Das hier habe ich mit aus diversen Forenbeiträgen zu POST zusammengesucht und auch schon verschiedentlich variiert:

Code: Alles auswählen

    *pass = UTF8(":" + passwort)
    dtext.s = "POST /requests/status.xml HTTP/1.0" + #CRLF$
    dtext + "Host: 127.0.0.1:49161" + #CRLF$
    dtext + "Accept: text/html" + #CRLF$
    dtext + "Connection: keep-alive" + #CRLF$
    dtext + "Authorization: " + Base64Encoder(*pass, MemorySize(*pass)) + #CRLF$ + #CRLF$
    dtext + "command=pl_play"
    FreeMemory(*pass)
    SendNetworkString(cIDlan, dtext)
Wie bekomme ich das Passwort an den VLC geschickt? Das muss doch irgendwie gehen...
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: http mit Authentifizierung für VLC-Player

Beitrag von Sven »

Hah! Kaum macht man es richtig, gehts auch. Naja, so halbwegs...

Code: Alles auswählen

 *pass = UTF8(":" + passwort)
    dtext.s = "POST /requests/status.xml?command=pl_play HTTP/1.0" + #CRLF$
    dtext + "Host: 127.0.0.1:49161" + #CRLF$
    dtext + "Keep-Alive: 300" + #CRLF$
    dtext + "Connection: keep-alive" + #CRLF$
    dtext + "Authorization: Basic " + Base64Encoder(*pass, MemorySize(*pass)) + #CRLF$ + #CRLF$
    FreeMemory(*pass)
    SendNetworkString(cIDlan, dtext)
So bekomme ich ein 200 OK und den Statusreport als XML zurück. Allerdings werden Befehle nur akzeptiert, wenn sie direkt hinter dem Ziellink stehen, nicht unter dem Request, wo sie ja eigentlich bei POST hingehören. Dabei müssen Pfade im Befehl mit URLEncoder übergeben werden.

Dabei ist es egal, ob der String mit POST oder mit GET beginnt.

Allerdings, und das ist echt doof, bekomme ich jedesmal trotz Connection: keep-alive ein Disconnect (#PB_NetworkEvent_Disconnect) vom VLC und muss mich erneut verbinden. Bekommt man das noch weg?
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: http mit Authentifizierung für VLC-Player

Beitrag von TroaX »

Sven hat geschrieben:Allerdings, und das ist echt doof, bekomme ich jedesmal trotz Connection: keep-alive ein Disconnect (#PB_NetworkEvent_Disconnect) vom VLC und muss mich erneut verbinden. Bekommt man das noch weg?
Bekommst du vom VLC-Webserver denn einen keep-alive Header zurück? Und ist der Webserver auch HTTP 1.1 und aufwärts?

Code: Alles auswählen

Keep-Alive: timeout=XX, max=XX
Wenn dem nicht so ist, dann hat der Webserver kein keep-alive oder er ist nicht darauf konfiguriert. Keep-Alive (persistente Verbindungen) wurde ab HTTP 1.1 eingeführt und soll eigentlich den Traffic und die Anfragezeiten bei Webseiten reduzieren, die aus vielen zusätzlichen Dateien bestehen (Bildern, CSS, Javascript etc.). Es ist nicht dafür gedacht, eine permanente TCP-Verbindung zum Server aufrecht zu halten. Du müsstest also als Client in regelmäßigen Abständen leere Requests an den Server senden, um die Pipeline aufrecht zu halten (das Timeout zu umgehen). Beim abspielen von Medien-Daten solltest du vielleicht einfach ohne Keep-Alive arbeiten, da dein Tool garnicht in einer skallierbaren Umgebung arbeiten muss und der Neuaufbau der einzelnen Verbindungen keine Rolle spielen dürfte. Denn die Anfrage-/Antwortzeiten sind so oder so relativ kurz und die Pakete enthalten außer dem Header eh nur einen Steuerbefehl.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: http mit Authentifizierung für VLC-Player

Beitrag von Sven »

Hab das Disconnect gelöst: Beim POST oder GET statt HTTP/1.0 muss HTTP/1.1 stehen, dann gibt es kein Disconnect mehr, auch ohne Keep-Alive.

Danke, guter Hinweis.

Einziges klitzekleines Problem: Beim Setzen der Lautstärke auf Prozentwert wird der Wert nicht akzeptiert: val=100%. Weder wenn ich es direkt als Zeichen (%) noch Urlencoded (%25) übergebe.

Setzen des Seeks mit Stunden, Minuten und Sekunden funktioniert, ebenso wie Setzen der absoluten Lautstärke (256 = 100%). Ich nehme an, es liegt am % Zeichen, welches falsch interpretiert wird. Muss ich noch bißchen rumprobieren.
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: http mit Authentifizierung für VLC-Player

Beitrag von TroaX »

Sven hat geschrieben:Setzen des Seeks mit Stunden, Minuten und Sekunden funktioniert, ebenso wie Setzen der absoluten Lautstärke (256 = 100%). Ich nehme an, es liegt am % Zeichen, welches falsch interpretiert wird. Muss ich noch bißchen rumprobieren.
Ist ja auch kein Wunder. In kodierten Strings steht das % für die Einleitung eines URL-Kodierten Zeichens. Entweder nimmst du den Code für das %-Zeichen (%25) oder lässt es weg. ;)
https://de.wikipedia.org/wiki/URL-Encoding
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: http mit Authentifizierung für VLC-Player

Beitrag von Sven »

TroaX hat geschrieben:Ist ja auch kein Wunder. In kodierten Strings steht das % für die Einleitung eines URL-Kodierten Zeichens. Entweder nimmst du den Code für das %-Zeichen (%25) oder lässt es weg.
Ja schon, aber mit %25 (UrlEncoded) geht es eben auch nicht. Und das %25 wird auch gesendet, sagt die Debug-Ausgabe des Sendestrings. Eventuell dekodiert der VLC das nicht richtig, aber %20 Leerzeichen in übergebenen Filenames funktionieren auch.

Mit ohne % entspricht ein val=256 100% Lautstärke, da muss ich halt umrechnen...
Antworten