记openresty的两个问题

今天开发resty代码遇到2个问题,特此记录下来。

问题1:小心lua模块cache

今天改造之前的lua代码,想要复用一个log库实现一个新接口,结果踩了一个非常低级的坑,下面简单记录一下。

这个模块有这样一个逻辑:

我以为每次处理nginx请求的时候,inited应该都初始化为false,然后调用do_something应该进入初始化代码段。

结果并不是这样的。

因为openresty对同一个lua模块只会加载一次并缓存,也就是说下一次请求的时候对应模块的lua文件不会再次从头解释执行,因为它已经作为一个table结构被缓存。

因为上述原因,inited在第一个请求时会变成inited=true,此后的请求就无法再走进if分支,导致行为不符合我的预期。

问题1:结论

不要在模块里写带状态的代码,因为任何模块里的状态都会被所有请求共享。


问题2:lua-resty-cookie解析Cookie截断

该库是官方建议的cookie解析库,它可以从header中取出cookie字段,然后解析成lua的table结构,方便我们获取。

问题是发现当cookie的value中存在空白时,value解析就不完整了。

官方ISSUE:https://github.com/cloudflare/lua-resty-cookie/issues/7

主要原因是该库严格遵循RFC标准,也就是以空白字符或者分号作为value的结束标记,而实际情况是客户端一般不会对空白字符做转移,从而导致了该库解析value时被截断。

解决办法就是打一个无关痛痒的Patch如下:

仅仅以分号作为value的结束标识,问题就可以得到解决了。

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~