From 859caa144da2b4e214c5dbe8907cc2b431bd2246 Mon Sep 17 00:00:00 2001 From: Whale Choi Date: Tue, 2 Apr 2024 13:49:14 +0800 Subject: [PATCH] update xray-core and sing-box object --- main/shareurls/trojan/singboxobject.go | 46 +++++---- main/shareurls/trojan/xrayobject.go | 126 +++++++++++++++--------- main/shareurls/vless/singboxobject.go | 46 +++++---- main/shareurls/vless/xrayobject.go | 127 ++++++++++++++++--------- main/shareurls/vmess/singboxobject.go | 40 ++++++-- main/shareurls/vmess/xrayobject.go | 118 ++++++++++++++--------- 6 files changed, 327 insertions(+), 176 deletions(-) diff --git a/main/shareurls/trojan/singboxobject.go b/main/shareurls/trojan/singboxobject.go index 764a39b..2266321 100644 --- a/main/shareurls/trojan/singboxobject.go +++ b/main/shareurls/trojan/singboxobject.go @@ -9,7 +9,9 @@ func getTrojanTlsObjectSingbox(trojan *Trojan) map[string]interface{} { tlsObject := make(map[string]interface{}) if len(trojan.Security) > 0 { tlsObject["enabled"] = true - tlsObject["server_name"] = trojan.Sni + if len(trojan.Sni) > 0 { + tlsObject["server_name"] = trojan.Sni + } var alpn []interface{} alpnSlice := strings.Split(trojan.Alpn, ",") for _, v := range alpnSlice { @@ -18,12 +20,6 @@ func getTrojanTlsObjectSingbox(trojan *Trojan) map[string]interface{} { tlsObject["alpn"] = alpn } } - //utlsObject := make(map[string]interface{}) - //if len(trojan.FingerPrint) > 0 { - // utlsObject["enabled"] = true - // utlsObject["fingerprint"] = trojan.FingerPrint - // tlsObject["utls"] = utlsObject - //} if trojan.Security == "reality" { realityObject := make(map[string]interface{}) realityObject["enabled"] = true @@ -43,22 +39,40 @@ func getTrojanTransportObjectSingbox(trojan *Trojan) map[string]interface{} { switch trojan.Network { case "tcp", "http", "h2": transportObject["type"] = "http" - var host []interface{} - host = append(host, trojan.Host) - transportObject["host"] = host - transportObject["path"] = trojan.Path + if len(trojan.Host) > 0 { + var host []interface{} + host = append(host, trojan.Host) + transportObject["host"] = host + } + if len(trojan.Path) > 0 { + transportObject["path"] = trojan.Path + } case "ws": transportObject["type"] = "ws" - transportObject["path"] = trojan.Path - headersObject := make(map[string]interface{}) - headersObject["Host"] = trojan.Host - transportObject["headers"] = headersObject + if len(trojan.Path) > 0 { + transportObject["path"] = trojan.Path + } + if len(trojan.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = trojan.Host + transportObject["headers"] = headersObject + } transportObject["early_data_header_name"] = "Sec-WebSocket-Protocol" case "quic": transportObject["type"] = "quic" case "grpc": transportObject["type"] = "grpc" - transportObject["service_name"] = trojan.Path + if len(trojan.Path) > 0 { + transportObject["service_name"] = trojan.Path + } + case "httpupgrade": + transportObject["type"] = "httpupgrade" + if len(trojan.Host) > 0 { + transportObject["host"] = trojan.Host + } + if len(trojan.Path) > 0 { + transportObject["path"] = trojan.Path + } } return transportObject } diff --git a/main/shareurls/trojan/xrayobject.go b/main/shareurls/trojan/xrayobject.go index 2f466fd..ed0ee34 100644 --- a/main/shareurls/trojan/xrayobject.go +++ b/main/shareurls/trojan/xrayobject.go @@ -37,25 +37,27 @@ func getStreamSettingsObjectXray(trojan *Trojan) map[string]interface{} { headerObject := make(map[string]interface{}) switch trojan.Type { case "http": - requestObject := make(map[string]interface{}) - headers := make(map[string]interface{}) - var connection []interface{} - connection = append(connection, "keep-alive") - var host []interface{} - host = append(host, trojan.Host) - var acceptEncoding []interface{} - acceptEncoding = append(acceptEncoding, "gzip, deflate") - var userAgent []interface{} - userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", - "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") - headers["Connection"] = connection - headers["Host"] = host - headers["Pragma"] = "no-cache" - headers["Accept-Encoding"] = acceptEncoding - headers["User-Agent"] = userAgent - requestObject["headers"] = headers headerObject["type"] = trojan.Type - headerObject["request"] = requestObject + if len(trojan.Host) > 0 { + requestObject := make(map[string]interface{}) + headers := make(map[string]interface{}) + var host []interface{} + host = append(host, trojan.Host) + var connection []interface{} + connection = append(connection, "keep-alive") + var acceptEncoding []interface{} + acceptEncoding = append(acceptEncoding, "gzip, deflate") + var userAgent []interface{} + userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") + headers["Host"] = host + headers["Connection"] = connection + headers["Pragma"] = "no-cache" + headers["Accept-Encoding"] = acceptEncoding + headers["User-Agent"] = userAgent + requestObject["headers"] = headers + headerObject["request"] = requestObject + } default: headerObject["type"] = "none" } @@ -63,46 +65,68 @@ func getStreamSettingsObjectXray(trojan *Trojan) map[string]interface{} { streamSettingsObject["tcpSettings"] = tcpSettingsObject case "kcp": kcpSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = trojan.Type + if len(trojan.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = trojan.Type + kcpSettingsObject["header"] = headerObject + } kcpSettingsObject["congestion"] = false kcpSettingsObject["downlinkCapacity"] = 100 - kcpSettingsObject["header"] = headerObject kcpSettingsObject["mtu"] = 1350 kcpSettingsObject["readBufferSize"] = 1 - kcpSettingsObject["seed"] = trojan.Path + if len(trojan.Path) > 0 { + kcpSettingsObject["seed"] = trojan.Path + } kcpSettingsObject["tti"] = 50 kcpSettingsObject["uplinkCapacity"] = 12 kcpSettingsObject["writeBufferSize"] = 1 streamSettingsObject["kcpSettings"] = kcpSettingsObject case "ws": wsSettingsObject := make(map[string]interface{}) - headersObject := make(map[string]interface{}) - headersObject["Host"] = trojan.Host - wsSettingsObject["headers"] = headersObject - wsSettingsObject["path"] = trojan.Path + if len(trojan.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = trojan.Host + wsSettingsObject["headers"] = headersObject + } + if len(trojan.Path) > 0 { + wsSettingsObject["path"] = trojan.Path + } streamSettingsObject["wsSettings"] = wsSettingsObject case "http", "h2": httpSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, trojan.Host) - httpSettingsObject["host"] = host - httpSettingsObject["path"] = trojan.Path + if len(trojan.Host) > 0 { + var host []interface{} + host = append(host, trojan.Host) + httpSettingsObject["host"] = host + } + if len(trojan.Path) > 0 { + httpSettingsObject["path"] = trojan.Path + } streamSettingsObject["httpSettings"] = httpSettingsObject case "httpupgrade": httpupgradeSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, trojan.Host) - httpupgradeSettingsObject["host"] = host - httpupgradeSettingsObject["path"] = trojan.Path + if len(trojan.Host) > 0 { + var host []interface{} + host = append(host, trojan.Host) + httpupgradeSettingsObject["host"] = host + } + if len(trojan.Path) > 0 { + httpupgradeSettingsObject["path"] = trojan.Path + } streamSettingsObject["httpupgrade"] = httpupgradeSettingsObject case "quic": quicSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = trojan.Type - quicSettingsObject["header"] = headerObject - quicSettingsObject["key"] = trojan.Path - quicSettingsObject["security"] = trojan.Host + if len(trojan.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = trojan.Type + quicSettingsObject["header"] = headerObject + } + if len(trojan.Path) > 0 { + quicSettingsObject["key"] = trojan.Path + } + if len(trojan.Host) > 0 { + quicSettingsObject["security"] = trojan.Host + } streamSettingsObject["quicSettings"] = quicSettingsObject case "grpc": grpcSettingsObject := make(map[string]interface{}) @@ -111,8 +135,12 @@ func getStreamSettingsObjectXray(trojan *Trojan) map[string]interface{} { } else { grpcSettingsObject["multiMode"] = false } - grpcSettingsObject["authority"] = trojan.Host - grpcSettingsObject["serviceName"] = trojan.Path + if len(trojan.Host) > 0 { + grpcSettingsObject["authority"] = trojan.Host + } + if len(trojan.Path) > 0 { + grpcSettingsObject["serviceName"] = trojan.Path + } streamSettingsObject["grpcSettings"] = grpcSettingsObject } streamSettingsObject["security"] = trojan.Security @@ -128,14 +156,22 @@ func getStreamSettingsObjectXray(trojan *Trojan) map[string]interface{} { } } tlsSettingsObject["allowInsecure"] = false - tlsSettingsObject["fingerprint"] = trojan.FingerPrint - tlsSettingsObject["serverName"] = trojan.Sni + if len(trojan.FingerPrint) > 0 { + tlsSettingsObject["fingerprint"] = trojan.FingerPrint + } + if len(trojan.Sni) > 0 { + tlsSettingsObject["serverName"] = trojan.Sni + } streamSettingsObject["tlsSettings"] = tlsSettingsObject case "reality": realitySettingsObject := make(map[string]interface{}) realitySettingsObject["allowInsecure"] = false - realitySettingsObject["fingerprint"] = trojan.FingerPrint - realitySettingsObject["serverName"] = trojan.Sni + if len(trojan.FingerPrint) > 0 { + realitySettingsObject["fingerprint"] = trojan.FingerPrint + } + if len(trojan.Sni) > 0 { + realitySettingsObject["serverName"] = trojan.Sni + } realitySettingsObject["publicKey"] = trojan.PublicKey realitySettingsObject["shortId"] = trojan.ShortId realitySettingsObject["spiderX"] = trojan.SpiderX diff --git a/main/shareurls/vless/singboxobject.go b/main/shareurls/vless/singboxobject.go index 46a9a97..3f9542d 100644 --- a/main/shareurls/vless/singboxobject.go +++ b/main/shareurls/vless/singboxobject.go @@ -9,7 +9,9 @@ func getVLESSTlsObjectSingbox(vless *VLESS) map[string]interface{} { tlsObject := make(map[string]interface{}) if len(vless.Security) > 0 { tlsObject["enabled"] = true - tlsObject["server_name"] = vless.Sni + if len(vless.Sni) > 0 { + tlsObject["server_name"] = vless.Sni + } var alpn []interface{} alpnSlice := strings.Split(vless.Alpn, ",") for _, v := range alpnSlice { @@ -18,12 +20,6 @@ func getVLESSTlsObjectSingbox(vless *VLESS) map[string]interface{} { tlsObject["alpn"] = alpn } } - //utlsObject := make(map[string]interface{}) - //if len(vless.FingerPrint) > 0 { - // utlsObject["enabled"] = true - // utlsObject["fingerprint"] = vless.FingerPrint - // tlsObject["utls"] = utlsObject - //} if vless.Security == "reality" { realityObject := make(map[string]interface{}) realityObject["enabled"] = true @@ -43,22 +39,40 @@ func getVLESSTransportObjectSingbox(vless *VLESS) map[string]interface{} { switch vless.Network { case "tcp", "http", "h2": transportObject["type"] = "http" - var host []interface{} - host = append(host, vless.Host) - transportObject["host"] = host - transportObject["path"] = vless.Path + if len(vless.Host) > 0 { + var host []interface{} + host = append(host, vless.Host) + transportObject["host"] = host + } + if len(vless.Path) > 0 { + transportObject["path"] = vless.Path + } case "ws": transportObject["type"] = "ws" - transportObject["path"] = vless.Path - headersObject := make(map[string]interface{}) - headersObject["Host"] = vless.Host - transportObject["headers"] = headersObject + if len(vless.Path) > 0 { + transportObject["path"] = vless.Path + } + if len(vless.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = vless.Host + transportObject["headers"] = headersObject + } transportObject["early_data_header_name"] = "Sec-WebSocket-Protocol" case "quic": transportObject["type"] = "quic" case "grpc": transportObject["type"] = "grpc" - transportObject["service_name"] = vless.Path + if len(vless.Path) > 0 { + transportObject["service_name"] = vless.Path + } + case "httpupgrade": + transportObject["type"] = "httpupgrade" + if len(vless.Host) > 0 { + transportObject["host"] = vless.Host + } + if len(vless.Path) > 0 { + transportObject["path"] = vless.Path + } } return transportObject } diff --git a/main/shareurls/vless/xrayobject.go b/main/shareurls/vless/xrayobject.go index fce6de6..57927d5 100644 --- a/main/shareurls/vless/xrayobject.go +++ b/main/shareurls/vless/xrayobject.go @@ -44,25 +44,27 @@ func getStreamSettingsObjectXray(vless *VLESS) map[string]interface{} { headerObject := make(map[string]interface{}) switch vless.Type { case "http": - requestObject := make(map[string]interface{}) - headers := make(map[string]interface{}) - var connection []interface{} - connection = append(connection, "keep-alive") - var host []interface{} - host = append(host, vless.Host) - var acceptEncoding []interface{} - acceptEncoding = append(acceptEncoding, "gzip, deflate") - var userAgent []interface{} - userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", - "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") - headers["Connection"] = connection - headers["Host"] = host - headers["Pragma"] = "no-cache" - headers["Accept-Encoding"] = acceptEncoding - headers["User-Agent"] = userAgent - requestObject["headers"] = headers headerObject["type"] = vless.Type - headerObject["request"] = requestObject + if len(vless.Host) > 0 { + requestObject := make(map[string]interface{}) + headers := make(map[string]interface{}) + var host []interface{} + host = append(host, vless.Host) + var connection []interface{} + connection = append(connection, "keep-alive") + var acceptEncoding []interface{} + acceptEncoding = append(acceptEncoding, "gzip, deflate") + var userAgent []interface{} + userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") + headers["Host"] = host + headers["Connection"] = connection + headers["Pragma"] = "no-cache" + headers["Accept-Encoding"] = acceptEncoding + headers["User-Agent"] = userAgent + requestObject["headers"] = headers + headerObject["request"] = requestObject + } default: headerObject["type"] = "none" } @@ -70,47 +72,68 @@ func getStreamSettingsObjectXray(vless *VLESS) map[string]interface{} { streamSettingsObject["tcpSettings"] = tcpSettingsObject case "kcp": kcpSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = vless.Type + if len(vless.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = vless.Type + kcpSettingsObject["header"] = headerObject + } kcpSettingsObject["congestion"] = false kcpSettingsObject["downlinkCapacity"] = 100 - kcpSettingsObject["header"] = headerObject kcpSettingsObject["mtu"] = 1350 kcpSettingsObject["readBufferSize"] = 1 - kcpSettingsObject["seed"] = vless.Path + if len(vless.Path) > 0 { + kcpSettingsObject["seed"] = vless.Path + } kcpSettingsObject["tti"] = 50 kcpSettingsObject["uplinkCapacity"] = 12 kcpSettingsObject["writeBufferSize"] = 1 streamSettingsObject["kcpSettings"] = kcpSettingsObject case "ws": wsSettingsObject := make(map[string]interface{}) - headersObject := make(map[string]interface{}) - headersObject["Host"] = vless.Host - wsSettingsObject["headers"] = headersObject - wsSettingsObject["path"] = vless.Path + if len(vless.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = vless.Host + wsSettingsObject["headers"] = headersObject + } + if len(vless.Path) > 0 { + wsSettingsObject["path"] = vless.Path + } streamSettingsObject["wsSettings"] = wsSettingsObject case "http", "h2": httpSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, vless.Host) - httpSettingsObject["host"] = host - httpSettingsObject["path"] = vless.Path + if len(vless.Host) > 0 { + var host []interface{} + host = append(host, vless.Host) + httpSettingsObject["host"] = host + } + if len(vless.Path) > 0 { + httpSettingsObject["path"] = vless.Path + } streamSettingsObject["httpSettings"] = httpSettingsObject case "httpupgrade": httpupgradeSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, vless.Host) - httpupgradeSettingsObject["host"] = host - httpupgradeSettingsObject["path"] = vless.Path + if len(vless.Host) > 0 { + var host []interface{} + host = append(host, vless.Host) + httpupgradeSettingsObject["host"] = host + } + if len(vless.Path) > 0 { + httpupgradeSettingsObject["path"] = vless.Path + } streamSettingsObject["httpupgrade"] = httpupgradeSettingsObject - case "quic": quicSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = vless.Type - quicSettingsObject["header"] = headerObject - quicSettingsObject["key"] = vless.Path - quicSettingsObject["security"] = vless.Host + if len(vless.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = vless.Type + quicSettingsObject["header"] = headerObject + } + if len(vless.Path) > 0 { + quicSettingsObject["key"] = vless.Path + } + if len(vless.Host) > 0 { + quicSettingsObject["security"] = vless.Host + } streamSettingsObject["quicSettings"] = quicSettingsObject case "grpc": grpcSettingsObject := make(map[string]interface{}) @@ -119,8 +142,12 @@ func getStreamSettingsObjectXray(vless *VLESS) map[string]interface{} { } else { grpcSettingsObject["multiMode"] = false } - grpcSettingsObject["authority"] = vless.Host - grpcSettingsObject["serviceName"] = vless.Path + if len(vless.Host) > 0 { + grpcSettingsObject["authority"] = vless.Host + } + if len(vless.Path) > 0 { + grpcSettingsObject["serviceName"] = vless.Path + } streamSettingsObject["grpcSettings"] = grpcSettingsObject } streamSettingsObject["security"] = vless.Security @@ -136,14 +163,22 @@ func getStreamSettingsObjectXray(vless *VLESS) map[string]interface{} { } } tlsSettingsObject["allowInsecure"] = false - tlsSettingsObject["fingerprint"] = vless.FingerPrint - tlsSettingsObject["serverName"] = vless.Sni + if len(vless.FingerPrint) > 0 { + tlsSettingsObject["fingerprint"] = vless.FingerPrint + } + if len(vless.Sni) > 0 { + tlsSettingsObject["serverName"] = vless.Sni + } streamSettingsObject["tlsSettings"] = tlsSettingsObject case "reality": realitySettingsObject := make(map[string]interface{}) realitySettingsObject["allowInsecure"] = false - realitySettingsObject["fingerprint"] = vless.FingerPrint - realitySettingsObject["serverName"] = vless.Sni + if len(vless.FingerPrint) > 0 { + realitySettingsObject["fingerprint"] = vless.FingerPrint + } + if len(vless.Sni) > 0 { + realitySettingsObject["serverName"] = vless.Sni + } realitySettingsObject["publicKey"] = vless.PublicKey realitySettingsObject["shortId"] = vless.ShortId realitySettingsObject["spiderX"] = vless.SpiderX diff --git a/main/shareurls/vmess/singboxobject.go b/main/shareurls/vmess/singboxobject.go index aedb255..7dbc89f 100644 --- a/main/shareurls/vmess/singboxobject.go +++ b/main/shareurls/vmess/singboxobject.go @@ -9,7 +9,9 @@ func getVmessTlsObjectSingbox(vmess *Vmess) map[string]interface{} { tlsObject := make(map[string]interface{}) if len(vmess.Tls) > 0 { tlsObject["enabled"] = true - tlsObject["server_name"] = vmess.Sni + if len(vmess.Sni) > 0 { + tlsObject["server_name"] = vmess.Sni + } var alpn []interface{} alpnSlice := strings.Split(string(vmess.Alpn), ",") for _, v := range alpnSlice { @@ -30,22 +32,40 @@ func getVmessTransportObjectSingbox(vmess *Vmess) map[string]interface{} { switch vmess.Network { case "tcp", "http", "h2": transportObject["type"] = "http" - var host []interface{} - host = append(host, vmess.Host) - transportObject["host"] = host - transportObject["path"] = vmess.Path + if len(vmess.Host) > 0 { + var host []interface{} + host = append(host, vmess.Host) + transportObject["host"] = host + } + if len(vmess.Path) > 0 { + transportObject["path"] = vmess.Path + } case "ws": transportObject["type"] = "ws" - transportObject["path"] = vmess.Path - headersObject := make(map[string]interface{}) - headersObject["Host"] = vmess.Host - transportObject["headers"] = headersObject + if len(vmess.Path) > 0 { + transportObject["path"] = vmess.Path + } + if len(vmess.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = vmess.Host + transportObject["headers"] = headersObject + } transportObject["early_data_header_name"] = "Sec-WebSocket-Protocol" case "quic": transportObject["type"] = "quic" case "grpc": transportObject["type"] = "grpc" - transportObject["service_name"] = vmess.Path + if len(vmess.Path) > 0 { + transportObject["service_name"] = vmess.Path + } + case "httpupgrade": + transportObject["type"] = "httpupgrade" + if len(vmess.Host) > 0 { + transportObject["host"] = vmess.Host + } + if len(vmess.Path) > 0 { + transportObject["path"] = vmess.Path + } } return transportObject } diff --git a/main/shareurls/vmess/xrayobject.go b/main/shareurls/vmess/xrayobject.go index 20baa59..53dc126 100644 --- a/main/shareurls/vmess/xrayobject.go +++ b/main/shareurls/vmess/xrayobject.go @@ -44,25 +44,27 @@ func getStreamSettingsObjectXray(vmess *Vmess) map[string]interface{} { headerObject := make(map[string]interface{}) switch vmess.Type { case "http": - requestObject := make(map[string]interface{}) - headers := make(map[string]interface{}) - var connection []interface{} - connection = append(connection, "keep-alive") - var host []interface{} - host = append(host, vmess.Host) - var acceptEncoding []interface{} - acceptEncoding = append(acceptEncoding, "gzip, deflate") - var userAgent []interface{} - userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", - "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") - headers["Connection"] = connection - headers["Host"] = host - headers["Pragma"] = "no-cache" - headers["Accept-Encoding"] = acceptEncoding - headers["User-Agent"] = userAgent - requestObject["headers"] = headers headerObject["type"] = vmess.Type - headerObject["request"] = requestObject + if len(vmess.Host) > 0 { + requestObject := make(map[string]interface{}) + headers := make(map[string]interface{}) + var host []interface{} + host = append(host, vmess.Host) + var connection []interface{} + connection = append(connection, "keep-alive") + var acceptEncoding []interface{} + acceptEncoding = append(acceptEncoding, "gzip, deflate") + var userAgent []interface{} + userAgent = append(userAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1") + headers["Host"] = host + headers["Connection"] = connection + headers["Pragma"] = "no-cache" + headers["Accept-Encoding"] = acceptEncoding + headers["User-Agent"] = userAgent + requestObject["headers"] = headers + headerObject["request"] = requestObject + } default: headerObject["type"] = "none" } @@ -70,46 +72,68 @@ func getStreamSettingsObjectXray(vmess *Vmess) map[string]interface{} { streamSettingsObject["tcpSettings"] = tcpSettingsObject case "kcp": kcpSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = vmess.Type + if len(vmess.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = vmess.Type + kcpSettingsObject["header"] = headerObject + } kcpSettingsObject["congestion"] = false kcpSettingsObject["downlinkCapacity"] = 100 - kcpSettingsObject["header"] = headerObject kcpSettingsObject["mtu"] = 1350 kcpSettingsObject["readBufferSize"] = 1 - kcpSettingsObject["seed"] = vmess.Path + if len(vmess.Path) > 0 { + kcpSettingsObject["seed"] = vmess.Path + } kcpSettingsObject["tti"] = 50 kcpSettingsObject["uplinkCapacity"] = 12 kcpSettingsObject["writeBufferSize"] = 1 streamSettingsObject["kcpSettings"] = kcpSettingsObject case "ws": wsSettingsObject := make(map[string]interface{}) - headersObject := make(map[string]interface{}) - headersObject["Host"] = vmess.Host - wsSettingsObject["headers"] = headersObject - wsSettingsObject["path"] = vmess.Path + if len(vmess.Host) > 0 { + headersObject := make(map[string]interface{}) + headersObject["Host"] = vmess.Host + wsSettingsObject["headers"] = headersObject + } + if len(vmess.Path) > 0 { + wsSettingsObject["path"] = vmess.Path + } streamSettingsObject["wsSettings"] = wsSettingsObject case "http", "h2": httpSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, vmess.Host) - httpSettingsObject["host"] = host - httpSettingsObject["path"] = vmess.Path + if len(vmess.Host) > 0 { + var host []interface{} + host = append(host, vmess.Host) + httpSettingsObject["host"] = host + } + if len(vmess.Path) > 0 { + httpSettingsObject["path"] = vmess.Path + } streamSettingsObject["httpSettings"] = httpSettingsObject case "httpupgrade": httpupgradeSettingsObject := make(map[string]interface{}) - var host []interface{} - host = append(host, vmess.Host) - httpupgradeSettingsObject["host"] = host - httpupgradeSettingsObject["path"] = vmess.Path + if len(vmess.Host) > 0 { + var host []interface{} + host = append(host, vmess.Host) + httpupgradeSettingsObject["host"] = host + } + if len(vmess.Path) > 0 { + httpupgradeSettingsObject["path"] = vmess.Path + } streamSettingsObject["httpupgrade"] = httpupgradeSettingsObject case "quic": quicSettingsObject := make(map[string]interface{}) - headerObject := make(map[string]interface{}) - headerObject["type"] = vmess.Type - quicSettingsObject["header"] = headerObject - quicSettingsObject["key"] = vmess.Path - quicSettingsObject["security"] = vmess.Host + if len(vmess.Type) > 0 { + headerObject := make(map[string]interface{}) + headerObject["type"] = vmess.Type + quicSettingsObject["header"] = headerObject + } + if len(vmess.Path) > 0 { + quicSettingsObject["key"] = vmess.Path + } + if len(vmess.Host) > 0 { + quicSettingsObject["security"] = vmess.Host + } streamSettingsObject["quicSettings"] = quicSettingsObject case "grpc": grpcSettingsObject := make(map[string]interface{}) @@ -118,8 +142,12 @@ func getStreamSettingsObjectXray(vmess *Vmess) map[string]interface{} { } else { grpcSettingsObject["multiMode"] = false } - grpcSettingsObject["authority"] = vmess.Host - grpcSettingsObject["serviceName"] = vmess.Path + if len(vmess.Host) > 0 { + grpcSettingsObject["authority"] = vmess.Host + } + if len(vmess.Path) > 0 { + grpcSettingsObject["serviceName"] = vmess.Path + } streamSettingsObject["grpcSettings"] = grpcSettingsObject } streamSettingsObject["security"] = vmess.Tls @@ -134,8 +162,12 @@ func getStreamSettingsObjectXray(vmess *Vmess) map[string]interface{} { } } tlsSettingsObject["allowInsecure"] = false - tlsSettingsObject["fingerprint"] = vmess.FingerPrint - tlsSettingsObject["serverName"] = vmess.Sni + if len(vmess.FingerPrint) > 0 { + tlsSettingsObject["fingerprint"] = vmess.FingerPrint + } + if len(vmess.Sni) > 0 { + tlsSettingsObject["serverName"] = vmess.Sni + } streamSettingsObject["tlsSettings"] = tlsSettingsObject } sockoptObject := make(map[string]interface{})