feat: add xhttp subscriptions, network monitoring, chart legend toggle and ticket sender labels
This commit is contained in:
@@ -36,6 +36,27 @@ class ClashMeta extends AbstractProtocol
|
||||
'http' => '0.0.0',
|
||||
'h2' => '0.0.0',
|
||||
'httpupgrade' => '0.0.0',
|
||||
'xhttp' => '0.0.0',
|
||||
],
|
||||
'strict' => true,
|
||||
],
|
||||
'*.vmess.protocol_settings.network' => [
|
||||
'whitelist' => [
|
||||
'tcp' => '0.0.0',
|
||||
'ws' => '0.0.0',
|
||||
'grpc' => '0.0.0',
|
||||
'http' => '0.0.0',
|
||||
'h2' => '0.0.0',
|
||||
'httpupgrade' => '0.0.0',
|
||||
],
|
||||
'strict' => true,
|
||||
],
|
||||
'*.trojan.protocol_settings.network' => [
|
||||
'whitelist' => [
|
||||
'tcp' => '0.0.0',
|
||||
'ws' => '0.0.0',
|
||||
'grpc' => '0.0.0',
|
||||
'httpupgrade' => '0.0.0',
|
||||
],
|
||||
'strict' => true,
|
||||
],
|
||||
@@ -468,6 +489,18 @@ class ClashMeta extends AbstractProtocol
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host'))
|
||||
$array['ws-opts']['headers'] = ['Host' => $host];
|
||||
break;
|
||||
case 'xhttp':
|
||||
$array['network'] = 'xhttp';
|
||||
$xhttpOpts = [];
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$xhttpOpts['path'] = $path;
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host'))
|
||||
$xhttpOpts['host'] = $host;
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode'))
|
||||
$xhttpOpts['mode'] = $mode;
|
||||
if (!empty($xhttpOpts))
|
||||
$array['xhttp-opts'] = $xhttpOpts;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -135,6 +135,17 @@ class General extends AbstractProtocol
|
||||
$config['path'] = $path;
|
||||
$config['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
break;
|
||||
case 'xhttp':
|
||||
$config['net'] = 'xhttp';
|
||||
$config['type'] = 'xhttp';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$config['path'] = $path;
|
||||
$config['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode', 'auto'))
|
||||
$config['mode'] = $mode;
|
||||
if ($extra = data_get($protocol_settings, 'network_settings.extra'))
|
||||
$config['extra'] = is_array($extra) && !empty($extra) ? json_encode($extra) : null;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -216,10 +227,13 @@ class General extends AbstractProtocol
|
||||
$config['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
break;
|
||||
case 'xhttp':
|
||||
$config['path'] = data_get($protocol_settings, 'network_settings.path');
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$config['path'] = $path;
|
||||
$config['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
$config['mode'] = data_get($protocol_settings, 'network_settings.mode', 'auto');
|
||||
$config['extra'] = json_encode(data_get($protocol_settings, 'network_settings.extra'));
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode', 'auto'))
|
||||
$config['mode'] = $mode;
|
||||
if ($extra = data_get($protocol_settings, 'network_settings.extra'))
|
||||
$config['extra'] = is_array($extra) && !empty($extra) ? json_encode($extra) : null;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -286,6 +300,16 @@ class General extends AbstractProtocol
|
||||
$array['path'] = $path;
|
||||
$array['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
break;
|
||||
case 'xhttp':
|
||||
$array['type'] = 'xhttp';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$array['path'] = $path;
|
||||
$array['host'] = data_get($protocol_settings, 'network_settings.host', $server['host']);
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode', 'auto'))
|
||||
$array['mode'] = $mode;
|
||||
if ($extra = data_get($protocol_settings, 'network_settings.extra'))
|
||||
$array['extra'] = is_array($extra) && !empty($extra) ? json_encode($extra) : null;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -225,6 +225,20 @@ class Loon extends AbstractProtocol
|
||||
if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName'))
|
||||
$config[] = "grpc-service-name={$serviceName}";
|
||||
break;
|
||||
case 'h2':
|
||||
$config[] = 'transport=h2';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$config[] = "path={$path}";
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host'))
|
||||
$config[] = "host=" . (is_array($host) ? $host[0] : $host);
|
||||
break;
|
||||
case 'httpupgrade':
|
||||
$config[] = 'transport=httpupgrade';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$config[] = "path={$path}";
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host']))
|
||||
$config[] = "host={$host}";
|
||||
break;
|
||||
}
|
||||
|
||||
$config = array_filter($config);
|
||||
@@ -295,6 +309,24 @@ class Loon extends AbstractProtocol
|
||||
$config[] = "grpc-service-name={$serviceName}";
|
||||
}
|
||||
break;
|
||||
case 'h2':
|
||||
$config[] = "transport=h2";
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path')) {
|
||||
$config[] = "path={$path}";
|
||||
}
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host')) {
|
||||
$config[] = "host=" . (is_array($host) ? $host[0] : $host);
|
||||
}
|
||||
break;
|
||||
case 'httpupgrade':
|
||||
$config[] = "transport=httpupgrade";
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path')) {
|
||||
$config[] = "path={$path}";
|
||||
}
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host'])) {
|
||||
$config[] = "host={$host}";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$config[] = "transport=tcp";
|
||||
break;
|
||||
|
||||
@@ -23,6 +23,10 @@ class Shadowrocket extends AbstractProtocol
|
||||
protected $protocolRequirements = [
|
||||
'shadowrocket.hysteria.protocol_settings.version' => [2 => '1993'],
|
||||
'shadowrocket.anytls.base_version' => '2592',
|
||||
'shadowrocket.trojan.protocol_settings.network' => [
|
||||
'whitelist' => ['tcp', 'ws', 'grpc', 'h2', 'httpupgrade'],
|
||||
'strict' => true,
|
||||
],
|
||||
];
|
||||
|
||||
public function handle()
|
||||
@@ -147,6 +151,18 @@ class Shadowrocket extends AbstractProtocol
|
||||
$config['peer'] = $host [0] ?? $server['host'];
|
||||
}
|
||||
break;
|
||||
case 'xhttp':
|
||||
$config['obfs'] = "xhttp";
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path')) {
|
||||
$config['path'] = $path;
|
||||
}
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host'])) {
|
||||
$config['obfsParam'] = $host;
|
||||
}
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode', 'auto')) {
|
||||
$config['mode'] = $mode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
$query = http_build_query($config, '', '&', PHP_QUERY_RFC3986);
|
||||
$uri = "vmess://{$userinfo}?{$query}";
|
||||
@@ -282,8 +298,8 @@ class Shadowrocket extends AbstractProtocol
|
||||
$params['sni'] = data_get($protocol_settings, 'reality_settings.server_name');
|
||||
break;
|
||||
default: // Standard TLS
|
||||
$params['allowInsecure'] = data_get($protocol_settings, 'allow_insecure');
|
||||
if ($serverName = data_get($protocol_settings, 'server_name')) {
|
||||
$params['allowInsecure'] = (int) data_get($protocol_settings, 'tls_settings.allow_insecure');
|
||||
if ($serverName = data_get($protocol_settings, 'tls_settings.server_name')) {
|
||||
$params['peer'] = $serverName;
|
||||
}
|
||||
break;
|
||||
@@ -299,6 +315,29 @@ class Shadowrocket extends AbstractProtocol
|
||||
$path = data_get($protocol_settings, 'network_settings.path');
|
||||
$params['plugin'] = "obfs-local;obfs=websocket;obfs-host={$host};obfs-uri={$path}";
|
||||
break;
|
||||
case 'h2':
|
||||
$params['obfs'] = 'h2';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$params['path'] = $path;
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host']))
|
||||
$params['obfsParam'] = is_array($host) ? $host[0] : $host;
|
||||
break;
|
||||
case 'httpupgrade':
|
||||
$params['obfs'] = 'httpupgrade';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$params['path'] = $path;
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host']))
|
||||
$params['obfsParam'] = $host;
|
||||
break;
|
||||
case 'xhttp':
|
||||
$params['obfs'] = 'xhttp';
|
||||
if ($path = data_get($protocol_settings, 'network_settings.path'))
|
||||
$params['path'] = $path;
|
||||
if ($host = data_get($protocol_settings, 'network_settings.host', $server['host']))
|
||||
$params['obfsParam'] = $host;
|
||||
if ($mode = data_get($protocol_settings, 'network_settings.mode', 'auto'))
|
||||
$params['mode'] = $mode;
|
||||
break;
|
||||
}
|
||||
$query = http_build_query($params);
|
||||
$addr = Helper::wrapIPv6($server['host']);
|
||||
|
||||
@@ -40,16 +40,25 @@ class SingBox extends AbstractProtocol
|
||||
],
|
||||
'protocol_settings.tls_settings.ech.enabled' => [
|
||||
1 => '1.5.0'
|
||||
],
|
||||
'protocol_settings.network' => [
|
||||
'xhttp' => '9999.0.0'
|
||||
]
|
||||
],
|
||||
'vmess' => [
|
||||
'protocol_settings.tls_settings.ech.enabled' => [
|
||||
1 => '1.5.0'
|
||||
],
|
||||
'protocol_settings.network' => [
|
||||
'xhttp' => '9999.0.0'
|
||||
]
|
||||
],
|
||||
'trojan' => [
|
||||
'protocol_settings.tls_settings.ech.enabled' => [
|
||||
1 => '1.5.0'
|
||||
],
|
||||
'protocol_settings.network' => [
|
||||
'xhttp' => '9999.0.0'
|
||||
]
|
||||
],
|
||||
'hysteria' => [
|
||||
|
||||
Reference in New Issue
Block a user