如何扩展一个OpenResty模块

栏目: IT技术 · 发布时间: 6年前

内容简介:因为 Lua 本身并没有继承之类的语法,所以我们不能通过 OOP 的套路来扩展模块,不过实际上对于 Lua 来说,扩展一个模块有更简单的方法,下面我们以在 aes 加解密的过程中,有一个「填充」的过程,相关技术细节可以参考我以前写的「聊聊AES」,当然,不懂也没关系,你只要知道目前的 resty.aes 不支持配置填充的功能即可,因为 OpenSSL 缺省是激活了填充的,所以一旦我们需要自定义填充方法,那么就需要关闭缺省的填充行为,此时 resty.aes 无能为力。通过查看 resty.aes 源代码,我

因为 Lua 本身并没有继承之类的语法,所以我们不能通过 OOP 的套路来扩展模块,不过实际上对于 Lua 来说,扩展一个模块有更简单的方法,下面我们以 lua-resty-string 模块中的 aes 加解密功能为例子来说明一下。

在 aes 加解密的过程中,有一个「填充」的过程,相关技术细节可以参考我以前写的「聊聊AES」,当然,不懂也没关系,你只要知道目前的 resty.aes 不支持配置填充的功能即可,因为 OpenSSL 缺省是激活了填充的,所以一旦我们需要自定义填充方法,那么就需要关闭缺省的填充行为,此时 resty.aes 无能为力。

通过查看 resty.aes 源代码,我们知道它是通过 ffi 调用 OpenSSL 来实现相关功能的,所以我们只要照猫画虎扩展 resty.aes 即可,不过不要修改 resty.aes 源代码,否则日后的升级会变得麻烦,最好是新建一个模块,比如本例中的 resty.aes_with_padding:

local aes = require "resty.aes"
local ffi = require "ffi"

local C = ffi.C

ffi.cdef[[
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int padding);
]]

function aes.set_padding(self, padding)
    local encrypt_ctx, decrypt_ctx = self._encrypt_ctx, self._decrypt_ctx

    if encrypt_ctx == nil or decrypt_ctx == nil then
        return nil, "not initialized"
    end

    C.EVP_CIPHER_CTX_set_padding(encrypt_ctx, padding)
    C.EVP_CIPHER_CTX_set_padding(decrypt_ctx, padding)

    return 1
end

return aes

实际使用的时候,把原本调用 resty.aes 的地方改成 resty.aes_with_padding,然后代码里通过调用新创建的 set_padding 方法来控制开启还是关闭填充。

怎么样,扩展一个OpenResty模块和把大象放冰箱一样简单吧,总共分三步:1)创建一个新模块;2)引入要扩展的原模块;3)直接给原模块附加新方法。

搞定!

如何扩展一个OpenResty模块


以上所述就是小编给大家介绍的《如何扩展一个OpenResty模块》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Mining

Data Mining

Jiawei Han、Micheline Kamber、Jian Pei / Morgan Kaufmann / 2011-7-6 / USD 74.95

The increasing volume of data in modern business and science calls for more complex and sophisticated tools. Although advances in data mining technology have made extensive data collection much easier......一起来看看 《Data Mining》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器