diff --git a/app/Protocols/Clash.php b/app/Protocols/Clash.php index 187f386..79627b5 100644 --- a/app/Protocols/Clash.php +++ b/app/Protocols/Clash.php @@ -170,16 +170,17 @@ class Clash implements ProtocolInterface break; case 'ws': $array['network'] = 'ws'; - $array['ws-opts']['path'] = data_get($protocol_settings, 'network_settings.path', '/'); - if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) { + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['ws-opts']['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) $array['ws-opts']['headers'] = ['Host' => $host]; - } break; case 'grpc': $array['network'] = 'grpc'; - $array['grpc-opts'] = [ - 'grpc-service-name' => data_get($protocol_settings, 'network_settings.serviceName') - ]; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['grpc-opts']['grpc-service-name'] = $serviceName; + break; + default: break; } return $array; @@ -206,16 +207,15 @@ class Clash implements ProtocolInterface break; case 'ws': $array['network'] = 'ws'; - $array['ws-opts']['path'] = data_get($protocol_settings, 'network_settings.path', '/'); - if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) { + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['ws-opts']['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) $array['ws-opts']['headers'] = ['Host' => $host]; - } break; case 'grpc': $array['network'] = 'grpc'; - $array['grpc-opts'] = [ - 'grpc-service-name' => data_get($protocol_settings, 'network_settings.serviceName') - ]; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['grpc-opts']['grpc-service-name'] = $serviceName; break; default: $array['network'] = 'tcp'; @@ -234,6 +234,6 @@ class Clash implements ProtocolInterface if (empty($exp)) { return false; } - return @preg_match((string)$exp, '') !== false; + return @preg_match((string) $exp, '') !== false; } } diff --git a/app/Protocols/ClashMeta.php b/app/Protocols/ClashMeta.php index 42c23dc..cd8d952 100644 --- a/app/Protocols/ClashMeta.php +++ b/app/Protocols/ClashMeta.php @@ -167,16 +167,15 @@ class ClashMeta implements ProtocolInterface break; case 'ws': $array['network'] = 'ws'; - $array['ws-opts'] = [ - 'path' => data_get($protocol_settings, 'network_settings.path'), - 'headers' => ['Host' => data_get($protocol_settings, 'network_settings.headers.Host', $server['host'])] - ]; + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['ws-opts']['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) + $array['ws-opts']['headers'] = ['Host' => $host]; break; case 'grpc': $array['network'] = 'grpc'; - $array['grpc-opts'] = [ - 'grpc-service-name' => data_get($protocol_settings, 'network_settings.serviceName') - ]; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['grpc-opts']['grpc-service-name'] = $serviceName; break; default: break; @@ -226,23 +225,15 @@ class ClashMeta implements ProtocolInterface switch (data_get($protocol_settings, 'network')) { case 'ws': $array['network'] = 'ws'; - $array['ws-opts']['path'] = data_get($protocol_settings, 'network_settings.path', '/'); - if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) { + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['ws-opts']['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) $array['ws-opts']['headers'] = ['Host' => $host]; - } break; case 'grpc': $array['network'] = 'grpc'; - $array['grpc-opts'] = [ - 'grpc-service-name' => data_get($protocol_settings, 'network_settings.serviceName') - ]; - break; - case 'h2': - $array['network'] = 'h2'; - $array['h2-opts'] = [ - 'path' => data_get($protocol_settings, 'network_settings.path', '/'), - 'host' => data_get($protocol_settings, 'network_settings.host') - ]; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['grpc-opts']['grpc-service-name'] = $serviceName; break; default: break; @@ -268,20 +259,23 @@ class ClashMeta implements ProtocolInterface } switch (data_get($protocol_settings, 'network')) { - case 'grpc': - $array['network'] = 'grpc'; - $array['grpc-opts'] = [ - 'grpc-service-name' => data_get($protocol_settings, 'network_settings.serviceName') - ]; + case 'tcp': + $array['network'] = 'tcp'; break; case 'ws': $array['network'] = 'ws'; - $array['ws-opts']['path'] = data_get($protocol_settings, 'network_settings.path', '/'); - if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) { + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['ws-opts']['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) $array['ws-opts']['headers'] = ['Host' => $host]; - } + break; + case 'grpc': + $array['network'] = 'grpc'; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['grpc-opts']['grpc-service-name'] = $serviceName; break; default: + $array['network'] = 'tcp'; break; } diff --git a/app/Protocols/General.php b/app/Protocols/General.php index ae6f853..871e241 100644 --- a/app/Protocols/General.php +++ b/app/Protocols/General.php @@ -189,6 +189,23 @@ class General implements ProtocolInterface $array['peer'] = $serverName; $array['sni'] = $serverName; } + switch ($server['protocol_settings']['network']) { + case 'ws': + $array['type'] = 'ws'; + if ($path = data_get($protocol_settings, 'network_settings.path')) + $array['path'] = $path; + if ($host = data_get($protocol_settings, 'network_settings.headers.Host')) + $array['host'] = $host; + break; + case 'grpc': + // Follow V2rayN family standards + $array['type'] = 'grpc'; + if ($serviceName = data_get($protocol_settings, 'network_settings.serviceName')) + $array['serviceName'] = $serviceName; + break; + default: + break; + } $query = http_build_query($array); $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri .= "\r\n";