4 Star 4 Fork 3

winfan/openresty_resumablejs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
crc32.lua 1.59 KB
一键复制 编辑 原始数据 按行查看 历史
tanwenliang 提交于 2016-04-15 12:52 . init code
-- Copyright (C) 2013 Piotr Gaertig
-- CRC32 checksum
local ffi = require('ffi')
local tonumber = tonumber
local string = string
local ngx = ngx
local table = table
module(...)
local zlib = ffi.load('z')
ffi.cdef[[
unsigned long crc32(unsigned long crc, const char *buf, unsigned len );
]]
function crc32(data, lastnum)
return tonumber(zlib.crc32(lastnum, data, #data))
end
function validhex(crchex) return #crchex <= 8 and string.match(crchex, "^%x+$") end
function tohex(crcnum) return string.format("%08.8x", crcnum) end
function crc32hex(data, last)
local lastnum = last and tonumber(last, 16) or 0
local currnum = crc32(data,lastnum)
return tohex(tonumber(currnum))
end
function handler()
return {
on_body_start = function (self, ctx)
ctx.current_checksum = ctx.last_checksum and tonumber(ctx.last_checksum, 16) or ( ctx.first_chunk and 0 )
-- stop checksum processing if X-Last-Checksum is not present for non first chunk
if not ctx.current_checksum then
self.on_body = nil
self.on_body_end = nil
end
end,
on_body = function (self, ctx, body)
ctx.current_checksum = crc32(body, ctx.current_checksum)
end,
on_body_end = function (self, ctx)
if ctx.checksum then
if tonumber(ctx.checksum,16) ~= ctx.current_checksum then
return {400, string.format("Chunk checksum mismatch client=[%s] server=[%s]", ctx.checksum, tohex(ctx.current_checksum))}
end
else
ctx.checksum = tohex(ctx.current_checksum)
end
if ctx.checksum then ngx.header['X-Checksum'] = ctx.checksum end
end
}
end
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Lua
1
https://gitee.com/winfan/openresty_resumablejs.git
git@gitee.com:winfan/openresty_resumablejs.git
winfan
openresty_resumablejs
openresty_resumablejs
master

搜索帮助