瀏覽代碼

Add host for WS

mhsanaei 11 月之前
父節點
當前提交
4e20bb5f02

+ 28 - 5
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)

+ 2 - 0
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},
         };
     }

+ 14 - 2
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;

+ 3 - 3
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}}

+ 3 - 0
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>