MaaAssistantArknights / MaaBackendCenter

MAA Copilot Backend
https://prts.plus
GNU Affero General Public License v3.0
73 stars 50 forks source link

fix:在作业查询接口加入了正则表达式的格式检查,若格式错误则返回400状态码及正则表达式不合法信息 #174

Open wxy3265 opened 2 weeks ago

wxy3265 commented 2 weeks ago

Java原生的正则表达式解析工具方法Pattern.compile()可以按照正则表达式解析字符串,该方法在正则表达式不合法时会抛出PatternSyntaxException。因此在按照正则表达式查询之前尝试调用该方法,若捕获到PatternSyntaxException异常说明解析失败,即表达式不合法,返回包括400状态码和错误信息的fail结果。

dragove commented 2 days ago

按照 mongodb 的文档 mongo使用的是 pcre2,需要完全相同的话可能需要引入 pcre4j 库,样例代码如下

    val pcre2 = Pcre2()
    val errCode = intArrayOf(0)
    val errOffset = longArrayOf(0)
    val code = pcre2.compile("(ab", 0, errCode, errOffset, 0);
    require(code != 0L) {
        "PCRE2 compilation failed with error code ${errCode[0]} at offset ${errOffset[0]}"
    }
    pcre2.codeFree(code)

kotlin-stdlib 中的 Regex 默认使用的是平台的正则库(JVM上就是java的这个Pattern类了)

速度上使用pcre2(这个库)会比直接用Pattern慢不少(大概慢20倍)

不过我个人认为这个性能慢也是可以接受的(在我的设备上简单预热后粗糙估计,平均一下耗时大概不到 0.01ms),或许可以考虑引入这个库。

PS: 同时我尝试了一下 ffm 版本,这个库的 ffm 版本只能通过 java 21 + preview 参数才能使用,升级 java 版本会不兼容,性能也比jna版本更差,可以无脑选择 jna 版本。