parent
3675d1d6a3
commit
d072090cae
@ -1,12 +1,20 @@ |
||||
package io.legado.app.web |
||||
|
||||
import fi.iki.elonen.NanoWSD |
||||
import io.legado.app.web.socket.BookSourceDebugWebSocket |
||||
import io.legado.app.web.socket.RssSourceDebugWebSocket |
||||
|
||||
class WebSocketServer(port: Int) : NanoWSD(port) { |
||||
|
||||
override fun openWebSocket(handshake: IHTTPSession): WebSocket? { |
||||
return if (handshake.uri == "/sourceDebug") { |
||||
SourceDebugWebSocket(handshake) |
||||
} else null |
||||
return when (handshake.uri) { |
||||
"/bookSourceDebug" -> { |
||||
BookSourceDebugWebSocket(handshake) |
||||
} |
||||
"/rssSourceDebug" -> { |
||||
RssSourceDebugWebSocket(handshake) |
||||
} |
||||
else -> null |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,93 @@ |
||||
package io.legado.app.web.socket |
||||
|
||||
|
||||
import fi.iki.elonen.NanoHTTPD |
||||
import fi.iki.elonen.NanoWSD |
||||
import io.legado.app.R |
||||
import io.legado.app.data.appDb |
||||
import io.legado.app.model.Debug |
||||
import io.legado.app.utils.* |
||||
import kotlinx.coroutines.* |
||||
import kotlinx.coroutines.Dispatchers.IO |
||||
import splitties.init.appCtx |
||||
import java.io.IOException |
||||
|
||||
|
||||
class RssSourceDebugWebSocket(handshakeRequest: NanoHTTPD.IHTTPSession) : |
||||
NanoWSD.WebSocket(handshakeRequest), |
||||
CoroutineScope by MainScope(), |
||||
Debug.Callback { |
||||
|
||||
private val notPrintState = arrayOf(10, 20, 30, 40) |
||||
|
||||
override fun onOpen() { |
||||
launch(IO) { |
||||
kotlin.runCatching { |
||||
while (isOpen) { |
||||
ping("ping".toByteArray()) |
||||
delay(30000) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
override fun onClose( |
||||
code: NanoWSD.WebSocketFrame.CloseCode, |
||||
reason: String, |
||||
initiatedByRemote: Boolean |
||||
) { |
||||
cancel() |
||||
Debug.cancelDebug(true) |
||||
} |
||||
|
||||
override fun onMessage(message: NanoWSD.WebSocketFrame) { |
||||
launch(IO) { |
||||
kotlin.runCatching { |
||||
if (!message.textPayload.isJson()) { |
||||
send("数据必须为Json格式") |
||||
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||
return@launch |
||||
} |
||||
val debugBean = GSON.fromJsonObject<Map<String, String>>(message.textPayload) |
||||
if (debugBean != null) { |
||||
val tag = debugBean["tag"] |
||||
if (tag.isNullOrBlank()) { |
||||
send(appCtx.getString(R.string.cannot_empty)) |
||||
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||
return@launch |
||||
} |
||||
appDb.rssSourceDao.getByKey(tag)?.let { |
||||
Debug.callback = this@RssSourceDebugWebSocket |
||||
Debug.startDebug(this, it) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
override fun onPong(pong: NanoWSD.WebSocketFrame) { |
||||
|
||||
} |
||||
|
||||
override fun onException(exception: IOException) { |
||||
Debug.cancelDebug(true) |
||||
} |
||||
|
||||
override fun printLog(state: Int, msg: String) { |
||||
if (state in notPrintState) { |
||||
return |
||||
} |
||||
runOnIO { |
||||
runCatching { |
||||
send(msg) |
||||
if (state == -1 || state == 1000) { |
||||
Debug.cancelDebug(true) |
||||
close(NanoWSD.WebSocketFrame.CloseCode.NormalClosure, "调试结束", false) |
||||
} |
||||
}.onFailure { |
||||
it.printOnDebug() |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue