Skip to content

Commit c997bc0

Browse files
committed
refactor: align Xray config JSON fields
1 parent 175841b commit c997bc0

4 files changed

Lines changed: 46 additions & 15 deletions

File tree

app/src/main/kotlin/engine/xray/CustomXrayConfigRewriter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ private fun JsonObject.overwriteAsteriskInboundDns(
5353
),
5454
)
5555

56-
return updatedWithout(setOf("fakedns")) {
56+
return updatedWithout(setOf("fakedns", "fakeDns")) {
5757
put("inbounds", request.inbounds.toJsonObjectArray())
5858
put("dns", buildXrayDnsConfig(dnsPlan))
59-
putIfNotNull("fakedns", dnsPlan.fakeDns)
59+
putIfNotNull("fakeDns", dnsPlan.fakeDns)
6060
put("outbounds", outboundsRewrite.outbounds)
6161
put("routing", routing)
6262
}

app/src/main/kotlin/engine/xray/GeneratedXrayConfig.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import kotlinx.serialization.json.JsonArray
77
import kotlinx.serialization.json.JsonElement
88
import kotlinx.serialization.json.JsonObject
99
import kotlinx.serialization.json.buildJsonObject
10-
import kotlinx.serialization.json.put
1110

1211
internal data class GeneratedXrayConfig(
1312
val log: JsonObject,
@@ -26,7 +25,7 @@ internal data class GeneratedXrayConfig(
2625
put("inbounds", inbounds)
2726
put("outbounds", outbounds)
2827
routing?.let { put("routing", it) }
29-
fakeDns?.let { put("fakedns", it) }
28+
fakeDns?.let { put("fakeDns", it) }
3029
observatory?.let { put("observatory", it) }
3130
burstObservatory?.let { put("burstObservatory", it) }
3231
}

app/src/main/kotlin/engine/xray/XrayOutboundJson.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ internal fun buildXrayObservatory(selectors: List<String>): JsonObject? {
5353
if (selectors.isEmpty()) return null
5454
return buildJsonObject {
5555
put("subjectSelector", selectors.distinct().toJsonStringArray())
56-
put("probeUrl", XrayObservatoryProbeUrl)
56+
put("probeURL", XrayObservatoryProbeUrl)
5757
put("probeInterval", "3m")
5858
put("enableConcurrency", true)
5959
}

app/src/main/kotlin/features/proxy/server/model/XrayOutbound.kt

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import kotlinx.serialization.json.Json
99
import kotlinx.serialization.json.JsonElement
1010
import kotlinx.serialization.json.JsonObject
1111
import kotlinx.serialization.json.JsonObjectBuilder
12+
import kotlinx.serialization.json.JsonPrimitive
1213
import kotlinx.serialization.json.add
1314
import kotlinx.serialization.json.buildJsonObject
15+
import kotlinx.serialization.json.contentOrNull
1416
import kotlinx.serialization.json.put
1517
import kotlinx.serialization.json.putJsonArray
1618
import kotlinx.serialization.json.putJsonObject
@@ -143,12 +145,10 @@ private fun JsonObjectBuilder.putRawSettings(params: V2RayParameters) {
143145

144146
private fun JsonObjectBuilder.putWsSettings(params: V2RayParameters) {
145147
putJsonObject("wsSettings") {
148+
val transportHeaders = params.httpTransportHeaders("WebSocket headers")
146149
putIfNotBlank("path", params.path)
147-
putIfNotBlank("host", params.host)
148-
val headers = params.headers.toXrayJsonObjectOrNull("WebSocket headers")
149-
if (headers != null) {
150-
put("headers", headers)
151-
}
150+
putIfNotBlank("host", transportHeaders.host)
151+
transportHeaders.headers?.let { put("headers", it) }
152152
}
153153
}
154154

@@ -164,12 +164,10 @@ private fun JsonObjectBuilder.putGrpcSettings(params: V2RayParameters) {
164164

165165
private fun JsonObjectBuilder.putHttpUpgradeSettings(params: V2RayParameters) {
166166
putJsonObject("httpupgradeSettings") {
167+
val transportHeaders = params.httpTransportHeaders("HTTPUpgrade headers")
167168
putIfNotBlank("path", params.path)
168-
putIfNotBlank("host", params.host)
169-
val headers = params.headers.toXrayJsonObjectOrNull("HTTPUpgrade headers")
170-
if (headers != null) {
171-
put("headers", headers)
172-
}
169+
putIfNotBlank("host", transportHeaders.host)
170+
transportHeaders.headers?.let { put("headers", it) }
173171
}
174172
}
175173

@@ -203,3 +201,37 @@ private fun String?.toXrayJsonObjectOrNull(fieldName: String): JsonObject? {
203201
return element as? JsonObject
204202
?: proxyValidationError(ProxyServerValidationError.JsonObjectRequired, fieldName)
205203
}
204+
205+
private data class XrayHttpTransportHeaders(
206+
val host: String?,
207+
val headers: JsonObject?,
208+
)
209+
210+
private fun V2RayParameters.httpTransportHeaders(fieldName: String): XrayHttpTransportHeaders {
211+
val explicitHost = host?.trim()?.takeIf(String::isNotEmpty)
212+
val parsedHeaders = headers.toXrayJsonObjectOrNull(fieldName)
213+
?: return XrayHttpTransportHeaders(host = explicitHost, headers = null)
214+
var hostHeader: String? = null
215+
val filteredHeaders = buildJsonObject {
216+
parsedHeaders.forEach { (name, value) ->
217+
if (name.equals("Host", ignoreCase = true)) {
218+
if (hostHeader.isNullOrBlank()) {
219+
hostHeader = value.headerStringOrNull()
220+
}
221+
} else {
222+
put(name, value)
223+
}
224+
}
225+
}
226+
return XrayHttpTransportHeaders(
227+
host = explicitHost ?: hostHeader,
228+
headers = filteredHeaders.takeIf { it.isNotEmpty() },
229+
)
230+
}
231+
232+
private fun JsonElement.headerStringOrNull(): String? {
233+
return (this as? JsonPrimitive)
234+
?.contentOrNull
235+
?.trim()
236+
?.takeIf(String::isNotEmpty)
237+
}

0 commit comments

Comments
 (0)