当前位置: 首页 > Linux

OpenResty下ApacheAntPath匹配库的使用

时间:2023-04-07 01:56:05 Linux

OpenResty下ApacheAntPath匹配库的使用1.简介OpenResty是一个基于Nginx和Lua的高性能web平台,而Lua相比编译型语言性能较差,所以我们使用编写共享对象库集成到OpenResty项目中。Luajit使用ffi调用libcgoantpath.so来实现模式匹配。基于以上思路,我们实现了一个符合ApacheAntPath标准的动态共享库。git地址:go-antpathv1.1。为了大家使用,我们也封装了lua-antpathv1.0.1的lua版本。欢迎多多指教。共同进步。2.参考http://ant.apache.org/manual/api/org/apache/tools/ant/https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/PathMatcher.htmlgo-antpathlua-antpathhttps://github.com/golang/go/wiki/cgohttps://golang.org/cmd/cgo/https://groups.google.com/forum/#!topic/golang-nuts/Nb-nfVdAyF0三、编译运行环境3.1编译环境GNUMake4.1golang1.9.2+git3.2运行环境luajit2.1antpath.go(执行make时自动下载)lua2gov1.0(执行make时自动下载)cjson(OpenResty自带的优秀库)4.使用4.1make#直接执行make会执行makeallmake#执行过程vibrant@vibrant-Thinkpad-T440P:~/lua/lua-antpath$makeCloninginto'go-antpath'...remote:枚举对象:11,done.remote:计数对象:100%(11/11),done.remote:压缩对象:100%(8/8),done.remote:Total267(delta4),重用9(delta3),打包重用256Receivingobjects:100%(267/267),58.44KiB|160.00KiB/s,完成。解析增量:100%(171/171),完成。注意:检查'784165d119eea7faa4a880f00f1ea0d672c50799'。你在'detacHEAD状态。您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下所做的任何提交,而不会通过执行另一个检查来影响任何分支。如果您想创建一个新分支以保留您创建的提交,您可以这样做(现在或稍后)通过再次将-b与checkout命令一起使用。示例:gitcheckout-b#删除gopath中的go-antpath项目。#从internet移动到GOPATHget--2019-04-1100:42:52--https://raw.githubusercontent.com/vibrantbyte/go-antpath/v1.1.1/antpath.goResolvingraw.githubusercontent.com(raw.githubusercontent.com)...151.101.196.133Connectingtoraw.githubusercontent.com(raw.githubusercontent.com)|151.101.196.133|:443...已连接。已发送HTTP请求,正在等待响应...200OKLength:1901(1.9K)[text/plain]Savingto:'antpath.go'antpath.go100%[===================>]1.86K--.-KB/sin0s2019-04-1100:42:53(99.0MB/s)-'antpath.go'saved[1901/1901]--2019-04-1100:42:53--https://raw.githubusercontent.com/vibrantbyte/lua2go/v1.0/lua/lua2go.luaResolvingraw.githubusercontent.com(raw.githubusercontent.com)...151.101.196.133正在连接到raw.githubusercontent.com(raw.githubusercontent.com)|151.101.196.133|:443...已连接。已发送HTTP请求,等待响应...200OKLength:5135(5.0K)[text/plain]Savingto:'lua2go.lua'lua2go.lua100%[=====================>]5.01K---.-KB/sin0s2019-04-1100:42:54(26.2MB/s)-'lua2go.lua'saved[5135/5135]executescriptgobuild-ldflags"-s-w"-buildmode=c-shared-olibcgoantpath.so./antpath.goinstallapplicationcleansuccessfulallisexecute.4.2复制文件#生成文件vibrant@vibrant-Thinkpad-T440P:~/lua/lua-antpath$lslibcgoantpath.soLICENSElua2go.luamain.luaMakefileREADME.md将libcgoantpath.so和lua2go.lua复制到自己的项目中使用,使用main.lua文件中的例子4.3执行测试#获取lua-antpath项目的main.lua程序并执行卢吉特。luajit./main.lua文件的调用方式如下:[外部字符*版本();外部无效增量(GoInt*值);externGoBoolIsPattern(GoString路径);外部GoBool匹配(GoString模式,GoString路径);externGoBoolMatchStart(GoString模式,GoString路径);externGoStringExtractPathWithinPattern(GoString模式,GoString路径);externGoStringExtractUriTemplateVariables(GoString模式,GoString路径);externGoStringCombine(GoStringpattern1,GoStringpattern2);externvoidSetPathSeparator(GoStringpathSeparator);externvoidSetCaseSensitive(GoInt8caseSensitive);externvoidSetTrim8TrimTokens(;externvoidSetCachePatterns(GoInt8cachePatterns);]]--使用Version函数--begin--localversion=antpath.Version()--1.获取版本号信息localv=lua2go.ToLuaString(version)--2.打印版本号信息print(v)--使用Version函数--end--print("------------------------")--使用Increment函数--begin----指针操作localintPtr=lua2go.ToGoPointer(1)antpath.Increment(intPtr)print(lua2go.ToLua(intPtr[0]))--使用Increment函数--end--print("----------------------")--使用Match函数--begin----1.验证是否匹配本地bn=antpath.Match(lua2go.ToGoString("/*/1.html"),lua2go.ToGoString("/100/1.html"))--2.打印匹配信息print(lua2go.ToLuaBool(bn))--使用Match函数--end--print("---------------------------")--使用IsPattern函数--begin--localispattern=antpath.IsPattern(lua2go.ToGoString("/*/1.html"))print(lua2go.ToLuaBool(ispattern))--使用IsPattern函数--end--print("--------------------------")--使用组合函数--begin--localcombine=antpath.Combine(lua2go.ToGoString("/hotels/*"),lua2go.ToGoString("/booking"))--1.打印你需要的模式信息print(lua2go.ToLuaString(combine.p))--2.使用lua2go.AddToGC(combine.p)后回收信息--使用Combine函数--end--print("---------------------------")--使用MatchStart函数--begin--localstart=antpath.MatchStart(lua2go.ToGoString("/*/1.html"),lua2go.ToGoString("/100/1.html"))print(lua2go.ToLuaBool(start))--使用MatchStart函数--end--print("------------------------")--使用ExtractPathWithinPattern函数--begin--localvariable=antpath.ExtractPathWithinPattern(lua2go.ToGoString("/docs/cvs/*.html"),lua2go.ToGoString("/docs/cvs/commit.html"))print(lua2go.ToLuaString(variable.p))--使用lua2go.AddToGC(variable.p)--使用ExtractPathWithinPattern函数--end--print("------------------------")--使用ExtractUriTemplateVariables函数--begin--localmap=antpath.ExtractUriTemplateVariables(lua2go.ToGoString("/hotels/{hotel}"),lua2go.ToGoString("/hotels/11232"))localmapstr=lua2go.ToLuaString(map.p)localdata=cjson.decode(mapstr)print(data.hotel)lua2go.AddToGC(map.p)--使用fExtractUriTemplateVariables函数--end--print("------------------------")--设置字段信息--begin--antpath.SetPathSeparator(lua2go.ToGoString("/"))print("SetPathSeparatorsucceeded")antpath.SetCaseSensitive(0)print("SetCaseSensitivewassuccessfulset")antpath.SetTrimTokens(1)print("SetTrimTokenswassuccessfullyset")antpath.SetCachePatterns(1)print("SetCachePatternswassuccessfullyset")--设置字段信息--结尾-