🐈

【PHP】 ReactPHP の Socket で TLS 対応の HTTP/1 クライアントをつくる

2024/07/05に公開

React\Socket\Connector を使って TLS 対応の HTTP/1 クライアントをつくった

client.php
<?php
require __DIR__ . '/vendor/autoload.php';

$uri = "tls://localhost:8080";
$connector = new React\Socket\Connector();

$connector->connect($uri)->then(function (React\Socket\ConnectionInterface $connection) {
    $connection->on('data', function ($chunk) use ($connection) {
        echo $chunk;
        $connection->end();
    });

    $connection->write("GET / HTTP/1.1\r\n");
    $connection->write("Host: localhost\r\n");
    $connection->write("\r\n");

}, function (Exception $e) {
    echo 'Error: ' . $e->getMessage() . PHP_EOL;
});

練習用のサーバーは Go で書いた

server.go
package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, world!\r\n")
}

func main() {
    http.HandleFunc("/", helloHandler)
//    http.ListenAndServe(":8000", nil)
    http.ListenAndServeTLS(":8080", "localhost.pem", "localhost-key.pem", nil)
}

自己証明書と秘密鍵は mkcert で生成した

mkcert localhost

サーバーの起動は次のとおり

go run server.go

HTTP/2 を無効にするには GODEBUG 環境変数を設定する

GODEBUG=http2server=0

レスポンスは HTTP/1 メッセージがまるごと表示される

> php client.php

HTTP/1.1 200 OK
Date: Fri, 05 Jul 2024 01:35:12 GMT
Content-Length: 15
Content-Type: text/plain; charset=utf-8

Hello, world!

Discussion