前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何扩展一个OpenResty模块

如何扩展一个OpenResty模块

作者头像
LA0WAN9
发布2021-12-14 09:02:15
4480
发布2021-12-14 09:02:15
举报
文章被收录于专栏:火丁笔记

因为 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:

代码语言:javascript
复制
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 模块和把大象放冰箱一样简单,只需三步:首先创建一个新模块;接着引入要扩展的旧模块;最后直接在新模块中给旧模块添加新方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档