diff --git a/backend/package.json b/backend/package.json index 2460f2df5..119cc92e4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.135", + "version": "2.14.136", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js index 9e0e52b61..a7fd3042b 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js @@ -90,11 +90,18 @@ params = "/"? "?" head:param tail:("&"@param)* { if (params["type"]) { proxy.network = params["type"] - if (params["path"]) { - $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); - } - if (params["host"]) { - $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + if (['grpc'].includes(proxy.network)) { + proxy[proxy.network + '-opts'] = { + 'grpc-service-name': params["serviceName"], + '_grpc-type': params["mode"], + }; + } else { + if (params["path"]) { + $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); + } + if (params["host"]) { + $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + } } } diff --git a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg index f2d2d71e2..5cb0b7ece 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg @@ -88,11 +88,18 @@ params = "/"? "?" head:param tail:("&"@param)* { if (params["type"]) { proxy.network = params["type"] - if (params["path"]) { - $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); - } - if (params["host"]) { - $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + if (['grpc'].includes(proxy.network)) { + proxy[proxy.network + '-opts'] = { + 'grpc-service-name': params["serviceName"], + '_grpc-type': params["mode"], + }; + } else { + if (params["path"]) { + $set(proxy, proxy.network+"-opts.path", decodeURIComponent(params["path"])); + } + if (params["host"]) { + $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); + } } } diff --git a/backend/src/core/proxy-utils/producers/uri.js b/backend/src/core/proxy-utils/producers/uri.js index f8ad2e4bc..179173543 100644 --- a/backend/src/core/proxy-utils/producers/uri.js +++ b/backend/src/core/proxy-utils/producers/uri.js @@ -201,6 +201,21 @@ export default function URI_Producer() { let trojanTransport = ''; if (proxy.network) { trojanTransport = `&type=${proxy.network}`; + if (['grpc'].includes(proxy.network)) { + let trojanTransportServiceName = + proxy[`${proxy.network}-opts`]?.[ + `${proxy.network}-service-name` + ]; + if (trojanTransportServiceName) { + trojanTransport += `&serviceName=${encodeURIComponent( + trojanTransportServiceName, + )}`; + } + trojanTransport += `&mode=${encodeURIComponent( + proxy[`${proxy.network}-opts`]?.['_grpc-type'] || + 'gun', + )}`; + } let trojanTransportPath = proxy[`${proxy.network}-opts`]?.path; let trojanTransportHost =