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 @@