Skip to content

Commit

Permalink
Migrating from Gson to kotlinx.serialization;
Browse files Browse the repository at this point in the history
Add outboundTag
  • Loading branch information
selcarpa committed Jun 20, 2023
1 parent 5c99195 commit 1e9816b
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 10 deletions.
7 changes: 5 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
plugins {
kotlin("jvm") version "1.8.0"
kotlin("plugin.serialization") version "1.8.21"
application
id("com.github.johnrengelman.shadow") version "7.1.2"
idea
}

group = "one.tain"
version = "1.7-SNAPSHOT"
version = "1.8-SNAPSHOT"

repositories {
mavenCentral()
}

dependencies {
implementation("io.netty:netty-all:4.1.93.Final")
implementation("com.google.code.gson:gson:2.10.1")
// implementation("com.google.code.gson:gson:2.10.1")
// implementation("io.jpower.kcp:kcp-netty:1.5.0")

//kotlin-logging
implementation("io.github.microutils:kotlin-logging-jvm:3.0.5")
implementation("ch.qos.logback:logback-classic:1.4.7")

implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")

testImplementation(kotlin("test"))
}

Expand Down
34 changes: 28 additions & 6 deletions src/main/kotlin/model/config/Configuration.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package model.config

import com.google.gson.Gson
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import java.io.File
import java.util.regex.Pattern
import java.util.stream.Collectors
private var rulesOrdered=false
@Serializable
data class ConfigurationSettings(
val inbounds: List<Inbound>, val outbounds: List<Outbound>
) {
Expand All @@ -27,33 +30,52 @@ data class ConfigurationSettings(
var ConfigurationUrl: String? = null
val Configuration: ConfigurationSettings by lazy { initConfiguration() }

@OptIn(ExperimentalSerializationApi::class)
private val json = Json {
isLenient = true
ignoreUnknownKeys=true
explicitNulls=false
}

private fun initConfiguration(): ConfigurationSettings {
val gson = Gson()
return if (ConfigurationUrl.orEmpty().isEmpty()) {
val content = this::class.java.getResource("/config.json5")?.readText()
// read all string
gson.fromJson(content, ConfigurationSettings::class.java)
json.decodeFromString<ConfigurationSettings>(content!!)
} else {
val content = File(ConfigurationUrl!!).readText()
gson.fromJson(content, ConfigurationSettings::class.java)
json.decodeFromString<ConfigurationSettings>(content)
}
}
}
}
@Serializable
data class Inbound(val port: Int, val protocol: String, val inboundStreamBy: InboundStreamBy?, val socks5Setting: Socks5Setting?, val trojanSetting: TrojanSetting?, val tag:String?)
@Serializable
data class Socks5Setting(val auth: Auth?)
@Serializable
data class Auth(val password: String, val username: String)
@Serializable
data class Outbound(val protocol: String, val trojanSetting: TrojanSetting?, val outboundStreamBy: OutboundStreamBy?, val tag:String?)
@Serializable
data class OutboundStreamBy(val type: String, val wsOutboundSetting: WsOutboundSetting?,val sock5OutboundSetting: Sock5OutboundSetting?,val httpOutboundSetting: HttpOutboundSetting?,val tcpOutboundSetting:TcpOutboundSetting?)
@Serializable
data class Sock5OutboundSetting(val auth: Auth?,val port:Int,val host:String)
@Serializable
data class HttpOutboundSetting(val auth: Auth?,val port:Int,val host:String)
@Serializable
data class TcpOutboundSetting(val port: Int, val host: String)
@Serializable
data class InboundStreamBy(val type: String, val wsInboundSetting: WsInboundSetting)
@Serializable
data class WsOutboundSetting(val path: String, val port: Int, val host: String)
@Serializable
data class WsInboundSetting(val path: String)
@Serializable
data class TrojanSetting(val password: String)
@Serializable
data class LogConfiguration(var level: String = "info", var pattern: String = "%date{ISO8601} %highlight(%level) [%t] %cyan(%logger{16}) %M: %msg%n", var maxHistory: Int = 7, var fileName: String = "", var path: String = "./logs/")
data class Rule(val type: String, val tag: String?, val protocol: String?, val order: Int, val destPattern: String?) {
@Serializable
data class Rule(val type: String, val tag: String?, val protocol: String?, val order: Int, val destPattern: String?,val outboundTag:String) {
val pattern: Pattern by lazy { loadPattern() }
private fun loadPattern(): Pattern {
if (destPattern == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,14 @@ fun resolveOutbound(inbound: Inbound, odor: Odor?=null): Optional<Outbound> {
return@filter true
} else if (it.pattern.matcher("${odor.host}:${odor.port}").matches()) {
return@filter true

}
}
return@filter false
}.findFirst()

if (matchingRule.isPresent) {
val matchingOutbound = Configuration.outbounds.stream()
.filter { outbound -> matchingRule.get().tag == outbound.tag }.findFirst()
.filter { outbound -> matchingRule.get().outboundTag == outbound.tag }.findFirst()
if (matchingOutbound.isPresent) {
return matchingOutbound
}
Expand Down

0 comments on commit 1e9816b

Please sign in to comment.