Guzzle mit CONNECT methode

  • Moin,

    ich würde gerne mit Guzzle über die Proxy mit einer RCON kommunizieren.

    Jedoch habe ich keine Ahnung wie man Guzzle richtig benutzt.

    Zurzeit erstelle ich einfach ein stream_socket_client (https://github.com/xXSchrandXx/de.xxschrandxx.wsc.minecraft-api). Dabei habe ich keine Ahnung davon.

    Falls es nicht geht (was ich eigentlich denke), würde ich mich auch über Feedback zu dem Verbinden mit der Proxy freuen.

    Danke für eure Zeit.


    Mit freundlichen Grüßen

    xXSchrandXx

  • ich weiß jetzt nicht wie man Guzzle im WCF aufruft, daher mache ich hier einfach Mal mehrere Codeschnipsel, wie ich es angehen würde:

    Ansonsten, wie oben und dann als Bleistift:

    PHP
    $client = new Client([
            'proxy' => 'p://127.1:3128',
    ]);

    Habe das jetzt nur eben am Handy gemacht, daher keine Haftung für Tippfehler!

    Projekte:

    XIVDATA - Eorzea Database

    A red dragon falls from the heavens... Ah, that memory has been lost. A shame. It was a favorite of mine...

  • Um den Client aufzurufen habe ich zum testen das benutzt:

    PHP
    $client = wcf\system\io\HttpFactory::getDefaultClient();

    Mein Problem ist nur, dass ich die Verbindung zur Proxy nicht nur für eine Anfrage benutzen möchte.

    Ich würde gerne nach dem Connect noch weitere Daten senden und Antworten bekommen.

    (Ich glaube mit der wcf\util\HTTPRequest funktioniert das auch nicht.)

  • Hallo,

    Guzzle ist ein HTTP-Client. Entsprechend können damit nur (sinnvoll) HTTP-Requests gesendet werden. Der Ansatz in der Datei auf GitHub sieht grundsätzlich richtig aus. Das ist aber alles ein bisschen fast'n'loose:

    • Es wird nicht berücksichtigt, ob der Proxy überhaupt gesetzt (nicht leer) ist.
    • Die Proxy-URL wird nicht sauber geparsed, sondern einfach nur mit dem Holzhammer das Protokoll ersetzt. Am besten mit: https://github.com/WoltLab/WCF/bl…l/Url.class.php
    • Die TLS-Validierung wird abgeschaltet (TLS funktioniert aber eh nicht, weil generell tcp gesetzt wird).
    • Die HTTP-Antwort wird nicht sauber geparsed, sondern einfach nur mal mit einem regulären Ausdruck auf grobe Konformität geprüft.
  • Moin,

    danke für deine Hilfe.

    Die HTTP-Antwort wird nicht sauber geparsed, sondern einfach nur mal mit einem regulären Ausdruck auf grobe Konformität geprüft.

    Wie parsed man Diese denn? Einfach explode('\n', $rsp) und dann das Array richtig packen mit $key: $value ist damit nicht gemeint, oder?

  • Hallo,

    am einfachsten liest du die Antwort zeilenweise mit fgets bis du eine leere Zeile siehst (nicht fread, das endet nämlich nicht bei Zeilen). Dann endet nämlich die HTTP-Antwort.

    Die erste gelesene Zeile ist die Status-Line, die interessiert dich. Da kannst du wohl einfach ^HTTP/([0-9]\.[0-9]) ([0-9]{3}) (.*)\r\n$ drauf. Die HTTP-Version findest du in der ersten Capturing-Gruppe, den Status in der zweiten. Die Version solltest du gegen 1.0 oder 1.1 prüfen. Den Status-Code prüfst du dann, dass der im Bereich von 200 bis 299 liegt.

    Die restlichen gelesenen Zeilen kannst du vermutlich einfach ignorieren, du musst sie aber lesen, da sie andernfalls als potentielle RCON-Antwort interpretiert würden.

  • Moin,

    kann man bestimmen, wie lang die Zeilen maximal werden?

    Zurzeit habe ich das gefühlt, dass fread sehr viel schneller war als fgets.

    Daher weiß ich nicht ob für meine Zwecke preg_split('/\n/', fread($this->proxy, 1024)) oder while (!empty($buffer = fgets($this->proxy))) besser wäre.

  • Hallo,

    ich kann dir jetzt nicht die PHP-Standardbibliothek erklären. Ich möchte aber zu bedenken geben, dass es auf die Performance des Codes nur in den wenigstens Fällen ankommt. Für die RCON-Kommunikation ist das vermutlich völlig egal. Verwende das was am Ende den lesbarsten Code erzeugt: Und das ist fgets. Wobei die Schleife in deinem Beitrag genau das falsche macht. Du willst lesen, bis zu eine leere Zeile hast. Nicht bis du das Ende des Streams erreicht hast. Schließlich musst du nach dem Proxy-Handshake ja auch noch die eigentliche RCON-Logik implementieren.

  • Auch wenn ich nie die komplette Antwort brauche, ist es also so besser?

  • Hallo,

    ich habe Schwierigkeiten dem Code zu folgen und weiß was da passieren soll. Die Logik ist auf jeden Fall nicht korrekt, weil die Status-Zeile durch Leerzeichen getrennt wird, nicht durch irgendeine beliebige Form von Whitespace.

    Ungetestet im WYSIWYG runtergeschrieben:

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!