Skip to content

app/Http/Controllers/Client/Protocols/Surge.php #3

@aiastia

Description

@aiastia

所有 WebSocket Headers(User-Agent、Host 等)一次性拼成一条“ws-headers= …”,并用 “|” 作为分隔符,形如:

因此我们不能再把每个 header 单独推一行,而是先把所有 header 拼成一条,然后一次 push。下面给出可直接替换原来那段判 wsSettings['headers'] 的代码块:

if ($server['network'] === 'ws') {
    array_push($config, 'ws=true');

    if ($server['networkSettings']) {
        $wsSettings = $server['networkSettings'];

        // 1. 如果有 path
        if (!empty($wsSettings['path'])) {
            array_push($config, "ws-path={$wsSettings['path']}");
        }

        // 2. 如果指定了 headers(可能有多条)
        if (!empty($wsSettings['headers']) && is_array($wsSettings['headers'])) {

            // 把每个 header 转成   key:"value"
            $pairs = [];
            foreach ($wsSettings['headers'] as $k => $v) {
                if (strval($v) !== '') {              // 空值就不拼
                    $pairs[] = $k . ':"' . str_replace('"', '\"', $v) . '"';
                }
            }

            if (!empty($pairs)) {
                $headerLine = 'ws-headers=' . implode('|', $pairs);
                array_push($config, $headerLine);
            }
        }
    }
}

举个例子

假设:

$wsSettings['headers'] = [
    'Host'        => '456.123.xyz',
    'User-Agent'  => 'chrome',
    'Accept-Language' => 'en-US',
];

则最终 $config 里相应的那一行就是:

ws-headers=Host:"456.123.xyz"|User-Agent:"chrome"|Accept-Language:"en-US"

如需保留原来的 Host 专属判断或其他逻辑,只要把上面“拼 $pairs”的部分插进去即可。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions