From d073dfeef8af21ba309650b9eb02f5d0482da2a9 Mon Sep 17 00:00:00 2001 From: xream Date: Fri, 10 May 2024 10:13:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20Trojan,=20VMess,?= =?UTF-8?q?=20VLESS=20httpupgrade(=E6=9A=82=E4=B8=8D=E6=94=AF=E6=8C=81=20S?= =?UTF-8?q?hadowsocks=20v2ray-plugin)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/core/proxy-utils/parsers/index.js | 24 +++++++++++++++-- .../proxy-utils/parsers/peggy/trojan-uri.js | 9 +++++++ .../proxy-utils/parsers/peggy/trojan-uri.peg | 9 +++++++ backend/src/core/proxy-utils/producers/uri.js | 26 ++++++++++++++++--- 5 files changed, 63 insertions(+), 7 deletions(-) diff --git a/backend/package.json b/backend/package.json index f26dfcc..a5989bd 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.307", + "version": "2.14.308", "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/index.js b/backend/src/core/proxy-utils/parsers/index.js index 499d305..8c24341 100644 --- a/backend/src/core/proxy-utils/parsers/index.js +++ b/backend/src/core/proxy-utils/parsers/index.js @@ -16,6 +16,7 @@ import { Base64 } from 'js-base64'; // Parse SS URI format (only supports new SIP002, legacy format is depreciated). // reference: https://github.com/shadowsocks/shadowsocks-org/wiki/SIP002-URI-Scheme function URI_SS() { + // TODO: ζš‚δΈζ”―ζŒ httpupgrade const name = 'URI SS Parser'; const test = (line) => { return /^ss:\/\//.test(line); @@ -299,6 +300,7 @@ function URI_VMess() { if (proxy.tls && proxy.sni) { proxy.sni = params.sni; } + let httpupgrade = false; // handle obfs if (params.net === 'ws' || params.obfs === 'websocket') { proxy.network = 'ws'; @@ -309,6 +311,12 @@ function URI_VMess() { proxy.network = 'http'; } else if (['grpc'].includes(params.net)) { proxy.network = 'grpc'; + } else if ( + params.net === 'httpupgrade' || + proxy.network === 'httpupgrade' + ) { + proxy.network = 'ws'; + httpupgrade = true; } if (proxy.network) { let transportHost = params.host ?? params.obfsParam; @@ -341,10 +349,15 @@ function URI_VMess() { '_grpc-type': getIfNotBlank(params.type), }; } else { - proxy[`${proxy.network}-opts`] = { + const opts = { path: getIfNotBlank(transportPath), headers: { Host: getIfNotBlank(transportHost) }, }; + if (httpupgrade) { + opts['v2ray-http-upgrade'] = true; + opts['v2ray-http-upgrade-fast-open'] = true; + } + proxy[`${proxy.network}-opts`] = opts; } } else { delete proxy.network; @@ -444,10 +457,13 @@ function URI_VLESS() { proxy[`${params.security}-opts`] = opts; } } - + let httpupgrade = false; proxy.network = params.type; if (proxy.network === 'tcp' && params.headerType === 'http') { proxy.network = 'http'; + } else if (proxy.network === 'httpupgrade') { + proxy.network = 'ws'; + httpupgrade = true; } if (!proxy.network && isShadowrocket && params.obfs) { proxy.network = params.obfs; @@ -485,6 +501,10 @@ function URI_VLESS() { if (['grpc'].includes(proxy.network)) { opts['_grpc-type'] = params.mode || 'gun'; } + if (httpupgrade) { + opts['v2ray-http-upgrade'] = true; + opts['v2ray-http-upgrade-fast-open'] = true; + } if (Object.keys(opts).length > 0) { proxy[`${proxy.network}-opts`] = opts; } 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 d38d44c..107b8ce 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.js @@ -89,7 +89,12 @@ params = "?" head:param tail:("&"@param)* { } if (params["type"]) { + let httpupgrade proxy.network = params["type"] + if(proxy.network === 'httpupgrade') { + proxy.network = 'ws' + httpupgrade = true + } if (['grpc'].includes(proxy.network)) { proxy[proxy.network + '-opts'] = { 'grpc-service-name': params["serviceName"], @@ -102,6 +107,10 @@ params = "?" head:param tail:("&"@param)* { if (params["host"]) { $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); } + if (httpupgrade) { + $set(proxy, proxy.network+"-opts.v2ray-http-upgrade", true); + $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true); + } } } 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 adb033f..28a8b87 100644 --- a/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg +++ b/backend/src/core/proxy-utils/parsers/peggy/trojan-uri.peg @@ -87,7 +87,12 @@ params = "?" head:param tail:("&"@param)* { } if (params["type"]) { + let httpupgrade proxy.network = params["type"] + if(proxy.network === 'httpupgrade') { + proxy.network = 'ws' + httpupgrade = true + } if (['grpc'].includes(proxy.network)) { proxy[proxy.network + '-opts'] = { 'grpc-service-name': params["serviceName"], @@ -100,6 +105,10 @@ params = "?" head:param tail:("&"@param)* { if (params["host"]) { $set(proxy, proxy.network+"-opts.headers.Host", decodeURIComponent(params["host"])); } + if (httpupgrade) { + $set(proxy, proxy.network+"-opts.v2ray-http-upgrade", true); + $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true); + } } } diff --git a/backend/src/core/proxy-utils/producers/uri.js b/backend/src/core/proxy-utils/producers/uri.js index 60cad08..c2150ec 100644 --- a/backend/src/core/proxy-utils/producers/uri.js +++ b/backend/src/core/proxy-utils/producers/uri.js @@ -84,6 +84,11 @@ export default function URI_Producer() { if (proxy.network === 'http') { net = 'tcp'; type = 'http'; + } else if ( + proxy.network === 'ws' && + proxy['ws-opts']?.['v2ray-http-upgrade'] + ) { + net = 'httpupgrade'; } result = { v: '2', @@ -172,9 +177,15 @@ export default function URI_Producer() { if (proxy.flow) { flow = `&flow=${encodeURIComponent(proxy.flow)}`; } - let vlessTransport = `&type=${encodeURIComponent( - proxy.network, - )}`; + let vlessType = proxy.network; + if ( + proxy.network === 'ws' && + proxy['ws-opts']?.['v2ray-http-upgrade'] + ) { + vlessType = 'httpupgrade'; + } + + let vlessTransport = `&type=${encodeURIComponent(vlessType)}`; if (['grpc'].includes(proxy.network)) { // https://github.com/XTLS/Xray-core/issues/91 vlessTransport += `&mode=${encodeURIComponent( @@ -220,7 +231,14 @@ export default function URI_Producer() { case 'trojan': let trojanTransport = ''; if (proxy.network) { - trojanTransport = `&type=${proxy.network}`; + let trojanType = proxy.network; + if ( + proxy.network === 'ws' && + proxy['ws-opts']?.['v2ray-http-upgrade'] + ) { + trojanType = 'httpupgrade'; + } + trojanTransport = `&type=${encodeURIComponent(trojanType)}`; if (['grpc'].includes(proxy.network)) { let trojanTransportServiceName = proxy[`${proxy.network}-opts`]?.[