<commit_before><?php

// 時間無制限
set_time_limit(0);

// TCPサーバソケットを生成
$srv = @stream_socket_server('tcp://localhost:8080');
if (!$srv) {
    fwrite(STDERR, error_get_last()['message'] . "\n");
    exit(1);
}
echo "Listening HTTP connection on http://localhost:8080...\n";

// HTTP用，WebSocket用それぞれのTCPクライアントソケットプール
$httpsockets = [];
$websockets = [];

// 無限ループ
while (true) {

    // 持続中のHTTP用TCPクライアントソケットが10個を超えたら古いものから削除
    $httpsockets = array_slice($httpsockets, -10);
    // 持続中のWebSocket用クライアントソケットが100個を超えたら古いものから削除
    $websockets = array_slice($websockets, -100);

    // 監視
    $read = array_merge($httpsockets, $websockets, [$srv]);
    $null = null;

    // 何も動きがなければループの最初に戻る
    if (stream_select($read, $null, $null, 5) <= 0) {
        continue;
    }

    // 動きのあったソケットを列挙
    foreach ($read as $socket) {

        // サーバソケットの場合はクライアントソケットを受け入れてHTTPプールに追加する
        if ($socket === $srv) {
            $con = stream_socket_accept($srv, 0);
            $httpsockets[(string)$con] = $con;
            echo "# New connection has been established! ($con)\r\n\r\n";
            echo "------------------\r\n\r\n";
            continue;
        }

        // Webブラウザが破棄したクライアントソケットは削除する
        if (feof($socket)) {
            if (isset($websockets[(string)$socket])) {
                // もしWebSocket用のものであれば，自分以外の全員に退出を通知する
                unset($websockets[(string)$socket]);
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("[System] User #%d exited", $socket),
                ]));
            } else {
                // HTTP用のものである場合
                unset($httpsockets[(string)$socket]);
                echo "# Connection has been expired... ($socket)\r\n\r\n";
                echo "------------------\r\n\r\n";
            }
            fclose($socket);
            continue;
        }

        // WebSocketにアップグレード済みのクライアントソケットの場合
        if (isset($websockets[(string)$socket])) {
            $msg = read_websocket_message($socket);
            if (is_object($msg) && $msg->opcode === 1) {
                // テキストフレームであれば全員に発言を通知
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("User #%d: %s", $socket, $msg->content),
                ]));
            }
            if (is_object($msg) && $msg->opcode === 8) {
                // 切断通知であれば自分以外の全員に通知
                unset($websockets[(string)$socket]);
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("[System] User #%d exited", $socket),
                ]));
                fclose($socket);
            }
            continue;
        }

        // HTTPヘッダを読み取る
        $headers = [];
        while (true) {
            $line = fgets($socket);
            if ($line === false) continue 2; // 更新連打対策
            echo $line; // ターミナルに表示
            $line = rtrim($line);
            if ($line === '') break; // 空行が見つかればそこでヘッダ終了<commit_msg>Added json_encode option<commit_after><?php

// 時間無制限
set_time_limit(0);

// TCPサーバソケットを生成
$srv = @stream_socket_server('tcp://localhost:8080');
if (!$srv) {
    fwrite(STDERR, error_get_last()['message'] . "\n");
    exit(1);
}
echo "Listening HTTP connection on http://localhost:8080...\n";

// HTTP用，WebSocket用それぞれのTCPクライアントソケットプール
$httpsockets = [];
$websockets = [];

// 無限ループ
while (true) {

    // 持続中のHTTP用TCPクライアントソケットが10個を超えたら古いものから削除
    $httpsockets = array_slice($httpsockets, -10);
    // 持続中のWebSocket用クライアントソケットが100個を超えたら古いものから削除
    $websockets = array_slice($websockets, -100);

    // 監視
    $read = array_merge($httpsockets, $websockets, [$srv]);
    $null = null;

    // 何も動きがなければループの最初に戻る
    if (stream_select($read, $null, $null, 5) <= 0) {
        continue;
    }

    // 動きのあったソケットを列挙
    foreach ($read as $socket) {

        // サーバソケットの場合はクライアントソケットを受け入れてHTTPプールに追加する
        if ($socket === $srv) {
            $con = stream_socket_accept($srv, 0);
            $httpsockets[(string)$con] = $con;
            echo "# New connection has been established! ($con)\r\n\r\n";
            echo "------------------\r\n\r\n";
            continue;
        }

        // Webブラウザが破棄したクライアントソケットは削除する
        if (feof($socket)) {
            if (isset($websockets[(string)$socket])) {
                // もしWebSocket用のものであれば，自分以外の全員に退出を通知する
                unset($websockets[(string)$socket]);
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("[System] User #%d exited", $socket),
                ]));
            } else {
                // HTTP用のものである場合
                unset($httpsockets[(string)$socket]);
                echo "# Connection has been expired... ($socket)\r\n\r\n";
                echo "------------------\r\n\r\n";
            }
            fclose($socket);
            continue;
        }

        // WebSocketにアップグレード済みのクライアントソケットの場合
        if (isset($websockets[(string)$socket])) {
            $msg = read_websocket_message($socket);
            if (is_object($msg) && $msg->opcode === 1) {
                // テキストフレームであれば全員に発言を通知
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("User #%d: %s", $socket, $msg->content),
                ], JSON_UNESCAPED_UNICODE));
            }
            if (is_object($msg) && $msg->opcode === 8) {
                // 切断通知であれば自分以外の全員に通知
                unset($websockets[(string)$socket]);
                write_websocket_message($socket, $websockets, json_encode([
                    'data' => sprintf("[System] User #%d exited", $socket),
                ]));
                fclose($socket);
            }
            continue;
        }

        // HTTPヘッダを読み取る
        $headers = [];
        while (true) {
            $line = fgets($socket);
            if ($line === false) continue 2; // 更新連打対策
            echo $line; // ターミナルに表示
            $line = rtrim($line);
            if ($line === '') break; // 空行が見つかればそこでヘッダ終了
{'fraction_non_alphanumeric': 0.16156771953034563, 'fraction_numerical': 0.008599305440714404, 'mean_word_length': 1.7922437673130194, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5697210', 'n_tokens_mistral': 2351, 'n_tokens_neox': 2233, 'n_words': 316}