diff --git a/sub/subService.go b/sub/subService.go index 607a001c..5ec43994 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -230,6 +230,7 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { headers, _ := splithttp["headers"].(map[string]interface{}) obj["host"] = searchHost(headers) } + obj["mode"] = splithttp["mode"].(string) } security, _ := stream["security"].(string) @@ -381,6 +382,7 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { headers, _ := splithttp["headers"].(map[string]interface{}) params["host"] = searchHost(headers) } + params["mode"] = splithttp["mode"].(string) } security, _ := stream["security"].(string) if security == "tls" { @@ -578,6 +580,7 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string headers, _ := splithttp["headers"].(map[string]interface{}) params["host"] = searchHost(headers) } + params["mode"] = splithttp["mode"].(string) } security, _ := stream["security"].(string) if security == "tls" { @@ -771,6 +774,7 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st headers, _ := splithttp["headers"].(map[string]interface{}) params["host"] = searchHost(headers) } + params["mode"] = splithttp["mode"].(string) } security, _ := stream["security"].(string) diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js index 767770fc..3650ef6f 100644 --- a/web/assets/js/model/outbound.js +++ b/web/assets/js/model/outbound.js @@ -69,12 +69,19 @@ const WireguardDomainStrategy = [ "ForceIPv6v4" ]; +const MODE_OPTION = { + AUTO: "auto", + PACKET_UP: "packet-up", + STREAM_UP: "stream-up", +}; + Object.freeze(Protocols); Object.freeze(SSMethods); Object.freeze(TLS_FLOW_CONTROL); Object.freeze(ALPN_OPTION); Object.freeze(OutboundDomainStrategies); Object.freeze(WireguardDomainStrategy); +Object.freeze(MODE_OPTION); class CommonClass { @@ -272,16 +279,18 @@ class HttpUpgradeStreamSettings extends CommonClass { } class SplitHTTPStreamSettings extends CommonClass { - constructor(path='/', host='') { + constructor(path='/', host='',mode = '') { super(); this.path = path; this.host = host; + this.mode = mode; } static fromJson(json={}) { return new SplitHTTPStreamSettings( json.path, json.host, + json.mode, ); } @@ -289,6 +298,7 @@ class SplitHTTPStreamSettings extends CommonClass { return { path: this.path, host: this.host, + mode: this.mode, }; } } @@ -643,7 +653,7 @@ class Outbound extends CommonClass { } else if (network === 'httpupgrade') { stream.httpupgrade = new HttpUpgradeStreamSettings(json.path,json.host); } else if (network === 'splithttp') { - stream.splithttp = new SplitHTTPStreamSettings(json.path,json.host); + stream.splithttp = new SplitHTTPStreamSettings(json.path,json.host,json.mode); } if(json.tls && json.tls == 'tls'){ @@ -687,7 +697,7 @@ class Outbound extends CommonClass { } else if (type === 'httpupgrade') { stream.httpupgrade = new HttpUpgradeStreamSettings(path,host); } else if (type === 'splithttp') { - stream.splithttp = new SplitHTTPStreamSettings(path,host); + stream.splithttp = new SplitHTTPStreamSettings(path,host,mode); } if(security == 'tls'){ diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js index b0168af1..f3681b35 100644 --- a/web/assets/js/model/xray.js +++ b/web/assets/js/model/xray.js @@ -79,6 +79,12 @@ const SNIFFING_OPTION = { FAKEDNS: "fakedns" }; +const MODE_OPTION = { + AUTO: "auto", + PACKET_UP: "packet-up", + STREAM_UP: "stream-up", +}; + Object.freeze(Protocols); Object.freeze(SSMethods); Object.freeze(TLS_FLOW_CONTROL); @@ -87,6 +93,8 @@ Object.freeze(TLS_CIPHER_OPTION); Object.freeze(UTLS_FINGERPRINT); Object.freeze(ALPN_OPTION); Object.freeze(SNIFFING_OPTION); +Object.freeze(MODE_OPTION); + class XrayCommonClass { @@ -463,7 +471,8 @@ class SplitHTTPStreamSettings extends XrayCommonClass { maxConnections: 0, cMaxReuseTimes: "64-128", cMaxLifetimeMs: 0 - } + }, + mode = MODE_OPTION.AUTO, ) { super(); this.path = path; @@ -474,7 +483,8 @@ class SplitHTTPStreamSettings extends XrayCommonClass { this.scMinPostsIntervalMs = scMinPostsIntervalMs; this.noSSEHeader = noSSEHeader; this.xPaddingBytes = xPaddingBytes; - this.xmux = xmux; + this.xmux = xmux; + this.mode = mode; } addHeader(name, value) { @@ -496,6 +506,7 @@ class SplitHTTPStreamSettings extends XrayCommonClass { json.noSSEHeader, json.xPaddingBytes, json.xmux, + json.mode, ); } @@ -514,7 +525,8 @@ class SplitHTTPStreamSettings extends XrayCommonClass { maxConnections: this.xmux.maxConnections, cMaxReuseTimes: this.xmux.cMaxReuseTimes, cMaxLifetimeMs: this.xmux.cMaxLifetimeMs - } + }, + mode: this.mode, }; } } @@ -1065,7 +1077,7 @@ class Inbound extends XrayCommonClass { canEnableReality() { if(![Protocols.VLESS, Protocols.TROJAN].includes(this.protocol)) return false; - return ["tcp", "http", "grpc"].includes(this.network); + return ["tcp", "http", "grpc", "splithttp"].includes(this.network); } canEnableStream() { @@ -1133,6 +1145,7 @@ class Inbound extends XrayCommonClass { const splithttp = this.stream.splithttp; obj.path = splithttp.path; obj.host = splithttp.host?.length>0 ? splithttp.host : this.getHeader(splithttp, 'host'); + obj.mode = splithttp.mode; } if (security === 'tls') { @@ -1205,6 +1218,7 @@ class Inbound extends XrayCommonClass { const splithttp = this.stream.splithttp; params.set("path", splithttp.path); params.set("host", splithttp.host?.length>0 ? splithttp.host : this.getHeader(splithttp, 'host')); + params.set("mode", splithttp.mode); break; } @@ -1308,6 +1322,7 @@ class Inbound extends XrayCommonClass { const splithttp = this.stream.splithttp; params.set("path", splithttp.path); params.set("host", splithttp.host?.length>0 ? splithttp.host : this.getHeader(splithttp, 'host')); + params.set("mode", splithttp.mode); break; } @@ -1390,6 +1405,7 @@ class Inbound extends XrayCommonClass { const splithttp = this.stream.splithttp; params.set("path", splithttp.path); params.set("host", splithttp.host?.length>0 ? splithttp.host : this.getHeader(splithttp, 'host')); + params.set("mode", splithttp.mode); break; } diff --git a/web/html/xui/form/outbound.html b/web/html/xui/form/outbound.html index 339d2497..183faa97 100644 --- a/web/html/xui/form/outbound.html +++ b/web/html/xui/form/outbound.html @@ -371,6 +371,11 @@ + + + [[ key ]] + + diff --git a/web/html/xui/form/stream/stream_splithttp.html b/web/html/xui/form/stream/stream_splithttp.html index 957720e9..12cd3cac 100644 --- a/web/html/xui/form/stream/stream_splithttp.html +++ b/web/html/xui/form/stream/stream_splithttp.html @@ -22,6 +22,12 @@ + + + [[ key ]] + + diff --git a/web/html/xui/inbound_info_modal.html b/web/html/xui/inbound_info_modal.html index fff3a03b..53de3d14 100644 --- a/web/html/xui/inbound_info_modal.html +++ b/web/html/xui/inbound_info_modal.html @@ -44,7 +44,14 @@ {{ i18n "none" }} - +