Socket Verbindung

Einleitung

rex_socket baut eine http- bzw. https-Verbindung zu einer Url oder Datei auf. Für Verbindungen über einen Proxy Server steht die Klasse rex_socket_proxy zur Verfügung. rex_socket_response ist nicht zur direkten Nutzung vorgesehen. Es wird von rex_socket aufgerufen, sobald ein Response abgesetzt wird (siehe Klassen- und Methodenbeschreibung)

Beispiel

try {
    //Baut die Verbindung auf. (Host, Port, SSL)
    $socket = rex_socket::factory('www.example.com',443, true);
    //Übergibt den Pfad an rex_socket
    $socket->setPath('/url/to/my/resource?param=1');
    //Übergib PHP Kontext-Optionen
    $socket->setOptions([
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false
        ]
    ]);
    //Setzt einen Request ab und bekommt ein rex_socket_request-Objekt zurück
    $response = $socket->doGet();
    //Prüft, ob die Antwort 200 ist
    if($response->isOk()) {
        //liest die Informationen aus der Datei
        $body = $response->getBody();
    }
    //Gibt im Falle einer fehlerhaften Verbindung einen Fehler zurück
} catch(rex_socket_exception $e) {
    //error message: $e->getMessage()
}

Klassen

rex_socket

Mit rex_socket wird eine klassische Socket-Verbindung hergestellt. Die zur Verfügung stehenden Methoden sind weiter unten aufgeführt.

rex_socket_proxy

Mit rex_socket_proxy kann man einzelne Verbindungen über einen ProxyServer herstellen. Diese Klasse erweitert rex_socket um die Methoden setDestination und setDestinationUrl.

Tipp: Proxyserver für alle Verbindungen

Sollen alle Verbindungen der gesamten Installation über einen Proxyserver übertragen werden ersetzt man in der config.yml redaxo/data/core/config.yml unter 'socket_proxy' den Value null mit dem gewünschten Proxyserver. Danach werden alle Verbindungen automatisch (auch Verbindungen über rex_socket) über diesen Proxy transferiert und der Einsatz von rex_socket_proxy ist nicht mehr nötig

rex_socket_response

Immer wenn über rex_socket oder rex_socket_proxy ein Request abgesetzt wird (doRequest, doGet, doPost, doDelete) bekommt man ein rex_socket_response-Objekt zurück. Hier stehen weitere Methoden zur Verfügung.

Methoden

factory

factory($host, $port, $ssl) Baut eine Socket-Instanz auf, die URL wird anschließend über 'setPath()' übergeben.

Hinweis: Kein Protokoll angeben (http/https)

Die Nutzung von SSL (HTTPS) wird über den 2. (Port) und 3. (SSL) Parameter gesteuert. rex_socket::factory('www.example.com',443, true)

factoryUrl

factoryUrl($url) Baut eine Socket-Instanz direkt mit einer URL auf.

setPath

setPath($path) Übergibt den kompletten Pfad bei der Verbindung über rex_socket::factory() (beginnend mit /)

setOptions

setOptions(array $options) Es können alle Kontextoptionen aus PHP (z.B. bindto, backlog, ipv6_v6only, so_reuseport, so_broadcast, tcp_nodelay) werden (https://www.php.net/manual/de/context.php)

setTimeout

setTimeout($timeout) Übergibt die gewünschte Timeout-Zeit in s oder ms

addBasicAuthorization

addBasicAuthorization($user, $password) Setzt einen Header mit Benutzername und Passwort zur Authentifizierung an einem geschützten Server

addHeader

addHeader($key, $value) Setzt die gewünschten Header im $key, $value Format. Zum Beispiel addHeader('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12.4; rv:101.0) Gecko/20100101 Firefox/101.0')

doRequest

doRequest($method, $data) Setzt den Request ab. Für get, post und deletegibt es alternativ eigene Methoden.

doGet

doGet() Setzt einen Get-Request ab.

followredirects (nur für Get-Requests)

followRedirects($redirects) Übergibt die Anzahl der Redirects der gefolgt werden soll bevor die Verbindung abgebrochen wird.

doPost

doPost($data, array $files) Setzt einen Post-Request ab. Der Inhalt des Bodys kann als string, array oder callback übergeben werden. Dateien (mit Dateityp) können als Array übergeben werden.

doDelete

doDelete() Setzt ein Delete-Request ab.

Methoden von rex_socket_proxy

Bei der Nutzung von rex_socket_proxy stehen zusätzlich zu den oben genannten Methoden zusätzlich folgende Methoden zur Verfügung.

setDestination

Wird die Verbindung über rex_socket_proxy aufgebaut, übergibt man mit factory() bzw. factoryURL() den Proxyserver. Die eigentliche Ziel-Url wird mit setDestination() übergeben. rex_socket_proxy::factoryUrl($proxyServer)->setDestination($host, $port, $ssl)

setDestinationUrl

Wird die Verbindung über rex_socket_proxy aufgebaut, übergibt man mit factory() bzw. factoryURL() den Proxyserver. Die eigentliche Ziel-Url wird mit setDestinationUrl() übergeben. rex_socket_proxy::factoryUrl($proxyServer)->setDestinationUrl($url)

Methoden von rex_socket_response

Immer wenn ein Request abgesetzt wird (doRequest, doGet, doPost, doDelete) bekommt man ein rex_socket_response-Objekt zurück. Hier stehen weitere Methoden zur Verfügung mit denen die Serverantwort und der Inhalt der Datei verarbeitet werden kann.

getBody

Die bevorzugte Methode um den Inhalt der Datei aufzurufen und zu verarbeiten. Im Hintergrund wird getBufferedBody() (siehe nächste Methode und die einzelnen Chunks in eine Variable geschrieben. Somit erhält man den kompletten Inhalt einer Datei ohen sich Gedanken über Speicher Probleme machen zu müssen.

getBufferedBody

Diese Methode wird von getBody() genutzt und ruft den Inhalt einer Datei in kleinen Teilen (Chunks) zu 1024 Zeichen ab um einen Speicherüberlauf zu vermeiden. Möchte man die Methode manuell nutzen muss man sie so oft aufrufen bis das Ergebnis false ist. Die Größe der Chunks lässt sich als Parameter mit übergeben getBufferedBody(256)

getHeader

getHeader() gibt den gesamten Header der geöffneten Datei zurück. Die einzelnen Values lassen sich durch Mitgeben des jeweiligen keys ausgeben. Zum Beispiel `getHeader('Date')

getStatusCode

getStatusCode() gibt ausschließlich den Statuscode der geöffneten Datei zurück.

getStatusMessage

geteStatusMessage() gibt ausschließlich die StatusMessage der geöffneten Datei zurück.

isClientError

Antwortet der Server mit einem StatusCode zwischen 400 und 500 wird true zurückgegeben, andernfalls false

isInformational

Antwortet der Server mit einem StatusCode zwischen 100 und 200 wird true zurückgegeben, andernfalls false

isInvalid

Antwortet der Server mit einem StatusCode kleiner 100 oder größer 600 wird true zurückgegeben, andernfalls false

isOK

Antwortet der Server mit dem StatusCode 200 wird true zurückgegeben, andernfalls false

isRedirection

Antwortet der Server mit einem StatusCode zwischen 300 und 400 wird true zurückgegeben, andernfalls false

isServerError

Antwortet der Server mit einem StatusCode zwischen 500 und 600 wird true zurückgegeben, andernfalls false

isSuccessful

Antwortet der Server mit einem StatusCode zwischen 200 und 300 wird true zurückgegeben, andernfalls false

writeBodyTo

Schreibt den aberufenen Body in eine Datei writeBodyTo($filname) auf dem Server