http-body-hash.lua 648 B

12345678910111213141516171819202122232425262728
  1. -- ngx.arg[1] => chunk
  2. -- ngx.arg[2] => eof
  3. -- 大文件只返回首块 hash(用户从廉价带宽获取内容)
  4. if ngx.ctx._switched then
  5. local chunk = ngx.arg[1]
  6. ngx.arg[1] = #chunk .. ',' .. ngx.crc32_long(chunk)
  7. ngx.arg[2] = true
  8. return
  9. end
  10. -- 计算 HTTP 返回数据的 hash(用于统计)
  11. if ngx.ctx._sha256 == nil then
  12. local resty_sha256 = require 'resty.sha256'
  13. ngx.ctx._sha256 = resty_sha256:new()
  14. end
  15. if ngx.arg[2] then
  16. local digest = ngx.ctx._sha256:final()
  17. digest = digest:sub(1, 16)
  18. local str = require 'resty.string'
  19. ngx.var._bodyhash = str.to_hex(digest)
  20. else
  21. ngx.ctx._sha256:update(ngx.arg[1])
  22. end