🐈
【PHP】 ReactPHP の Socket で TLS 対応の HTTP/1 クライアントをつくる
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