Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormhsanaei <ho3ein.sanaei@gmail.com>2024-04-01 15:32:02 +0300
committermhsanaei <ho3ein.sanaei@gmail.com>2024-04-01 15:32:02 +0300
commit4e20bb5f02c4aef31c9026458984825e820414ba (patch)
tree2229b2c5ce10742631b39efa4f6c1099c6d1f74f
parent44b7eb881cb2ff2142f3566913c1e70ee8106556 (diff)
Add host for WS
-rw-r--r--sub/subService.go33
-rw-r--r--web/assets/js/model/outbound.js2
-rw-r--r--web/assets/js/model/xray.js16
-rw-r--r--web/html/xui/form/stream/stream_httpupgrade.html6
-rw-r--r--web/html/xui/form/stream/stream_ws.html3
5 files changed, 50 insertions, 10 deletions
diff --git a/sub/subService.go b/sub/subService.go
index 42713756..ae530597 100644
--- a/sub/subService.go
+++ b/sub/subService.go
@@ -202,8 +202,13 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string {
case "ws":
ws, _ := stream["wsSettings"].(map[string]interface{})
obj["path"] = ws["path"].(string)
- headers, _ := ws["headers"].(map[string]interface{})
- obj["host"] = searchHost(headers)
+ obj["host"] = ws["host"].(string)
+ if headers, ok := ws["headers"].(map[string]interface{}); ok {
+ hostFromHeaders := searchHost(headers)
+ if hostFromHeaders != "" {
+ obj["host"] = hostFromHeaders
+ }
+ }
case "http":
obj["net"] = "h2"
http, _ := stream["httpSettings"].(map[string]interface{})
@@ -343,7 +348,13 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string {
ws, _ := stream["wsSettings"].(map[string]interface{})
params["path"] = ws["path"].(string)
headers, _ := ws["headers"].(map[string]interface{})
- params["host"] = searchHost(headers)
+ params["host"] = ws["host"].(string)
+ if headers != nil {
+ hostFromHeaders := searchHost(headers)
+ if hostFromHeaders != "" {
+ params["host"] = hostFromHeaders
+ }
+ }
case "http":
http, _ := stream["httpSettings"].(map[string]interface{})
params["path"] = http["path"].(string)
@@ -560,7 +571,13 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string
ws, _ := stream["wsSettings"].(map[string]interface{})
params["path"] = ws["path"].(string)
headers, _ := ws["headers"].(map[string]interface{})
- params["host"] = searchHost(headers)
+ params["host"] = ws["host"].(string)
+ if headers != nil {
+ hostFromHeaders := searchHost(headers)
+ if hostFromHeaders != "" {
+ params["host"] = hostFromHeaders
+ }
+ }
case "http":
http, _ := stream["httpSettings"].(map[string]interface{})
params["path"] = http["path"].(string)
@@ -778,7 +795,13 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st
ws, _ := stream["wsSettings"].(map[string]interface{})
params["path"] = ws["path"].(string)
headers, _ := ws["headers"].(map[string]interface{})
- params["host"] = searchHost(headers)
+ params["host"] = ws["host"].(string)
+ if headers != nil {
+ hostFromHeaders := searchHost(headers)
+ if hostFromHeaders != "" {
+ params["host"] = hostFromHeaders
+ }
+ }
case "http":
http, _ := stream["httpSettings"].(map[string]interface{})
params["path"] = http["path"].(string)
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index 708728a8..aa83287c 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -194,6 +194,7 @@ class WsStreamSettings extends CommonClass {
static fromJson(json={}) {
return new WsStreamSettings(
json.path,
+ json.host,
json.headers && !ObjectUtil.isEmpty(json.headers.Host) ? json.headers.Host : '',
);
}
@@ -201,6 +202,7 @@ class WsStreamSettings extends CommonClass {
toJson() {
return {
path: this.path,
+ host: this.host,
headers: ObjectUtil.isEmpty(this.host) ? undefined : {Host: this.host},
};
}
diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js
index 9d863798..40e435cc 100644
--- a/web/assets/js/model/xray.js
+++ b/web/assets/js/model/xray.js
@@ -338,10 +338,11 @@ class KcpStreamSettings extends XrayCommonClass {
}
class WsStreamSettings extends XrayCommonClass {
- constructor(acceptProxyProtocol=false, path='/', headers=[]) {
+ constructor(acceptProxyProtocol=false, path='/', host='', headers=[]) {
super();
this.acceptProxyProtocol = acceptProxyProtocol;
this.path = path;
+ this.host = host;
this.headers = headers;
}
@@ -366,6 +367,7 @@ class WsStreamSettings extends XrayCommonClass {
return new WsStreamSettings(
json.acceptProxyProtocol,
json.path,
+ json.host,
XrayCommonClass.toHeaders(json.headers),
);
}
@@ -374,6 +376,7 @@ class WsStreamSettings extends XrayCommonClass {
return {
acceptProxyProtocol: this.acceptProxyProtocol,
path: this.path,
+ host: this.host,
headers: XrayCommonClass.toV2Headers(this.headers, false),
};
}
@@ -1108,7 +1111,12 @@ class Inbound extends XrayCommonClass {
if (this.isTcp) {
return this.stream.tcp.request.getHeader("Host");
} else if (this.isWs) {
- return this.stream.ws.getHeader("Host");
+ const hostHeader = this.stream.ws.getHeader("Host");
+ if (hostHeader !== null) {
+ return hostHeader;
+ } else {
+ return this.stream.ws.host;
+ }
} else if (this.isH2) {
return this.stream.http.host[0];
} else if (this.isHttpupgrade) {
@@ -1230,6 +1238,7 @@ class Inbound extends XrayCommonClass {
} else if (network === 'ws') {
let ws = this.stream.ws;
obj.path = ws.path;
+ obj.host = ws.host;
let index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host');
if (index >= 0) {
obj.host = ws.headers[index].value;
@@ -1300,6 +1309,7 @@ class Inbound extends XrayCommonClass {
case "ws":
const ws = this.stream.ws;
params.set("path", ws.path);
+ params.set("host", ws.host);
const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host');
if (index >= 0) {
const host = ws.headers[index].value;
@@ -1420,6 +1430,7 @@ class Inbound extends XrayCommonClass {
case "ws":
const ws = this.stream.ws;
params.set("path", ws.path);
+ params.set("host", ws.host);
const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host');
if (index >= 0) {
const host = ws.headers[index].value;
@@ -1507,6 +1518,7 @@ class Inbound extends XrayCommonClass {
case "ws":
const ws = this.stream.ws;
params.set("path", ws.path);
+ params.set("host", ws.host);
const index = ws.headers.findIndex(header => header.name.toLowerCase() === 'host');
if (index >= 0) {
const host = ws.headers[index].value;
diff --git a/web/html/xui/form/stream/stream_httpupgrade.html b/web/html/xui/form/stream/stream_httpupgrade.html
index 15c02aeb..31897804 100644
--- a/web/html/xui/form/stream/stream_httpupgrade.html
+++ b/web/html/xui/form/stream/stream_httpupgrade.html
@@ -3,11 +3,11 @@
<a-form-item label="PROXY Protocol">
<a-switch v-model="inbound.stream.httpupgrade.acceptProxyProtocol"></a-switch>
</a-form-item>
- <a-form-item label='{{ i18n "path" }}'>
- <a-input v-model.trim="inbound.stream.httpupgrade.path"></a-input>
- </a-form-item>
<a-form-item label='{{ i18n "host" }}'>
<a-input v-model.trim="inbound.stream.httpupgrade.host"></a-input>
</a-form-item>
+ <a-form-item label='{{ i18n "path" }}'>
+ <a-input v-model.trim="inbound.stream.httpupgrade.path"></a-input>
+ </a-form-item>
</a-form>
{{end}}
diff --git a/web/html/xui/form/stream/stream_ws.html b/web/html/xui/form/stream/stream_ws.html
index 62380e94..44ebca8d 100644
--- a/web/html/xui/form/stream/stream_ws.html
+++ b/web/html/xui/form/stream/stream_ws.html
@@ -3,6 +3,9 @@
<a-form-item label="PROXY Protocol">
<a-switch v-model="inbound.stream.ws.acceptProxyProtocol"></a-switch>
</a-form-item>
+ <a-form-item label='{{ i18n "host" }}'>
+ <a-input v-model.trim="inbound.stream.ws.host"></a-input>
+ </a-form-item>
<a-form-item label='{{ i18n "path" }}'>
<a-input v-model.trim="inbound.stream.ws.path"></a-input>
</a-form-item>