utils.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. local consts = require "resty.t1k.constants"
  2. local _M = {
  3. _VERSION = '1.0.0'
  4. }
  5. local band = bit.band
  6. local bnot = bit.bnot
  7. local lshift = bit.lshift
  8. local rshift = bit.rshift
  9. local abs = math.abs
  10. local char = string.char
  11. local ngx = ngx
  12. local ngx_re = ngx.re
  13. local re_match = ngx_re.match
  14. local re_gmatch = ngx_re.gmatch
  15. local re_gsub = ngx_re.gsub
  16. local NOT_MASK_FIRST = bnot(consts.MASK_FIRST)
  17. local NOT_MASK_LAST = bnot(consts.MASK_LAST)
  18. function _M.int_to_char_length(x)
  19. return char(band(x, 0xff)) .. char(band(rshift(x, 8), 0xff)) ..
  20. char(band(rshift(x, 16), 0xff)) .. char(band(rshift(x, 24), 0xff))
  21. end
  22. function _M.char_to_int_length(l)
  23. return l:byte(1, 1) + lshift(l:byte(2, 2), 8) + lshift(l:byte(3, 3), 16) + lshift(l:byte(4, 4), 24)
  24. end
  25. function _M.is_mask_first(b)
  26. return band(b, consts.MASK_FIRST) == consts.MASK_FIRST
  27. end
  28. function _M.is_mask_last(b)
  29. return band(b, consts.MASK_LAST) == consts.MASK_LAST
  30. end
  31. local function tag_parser(tag)
  32. return band(band(tag, NOT_MASK_FIRST), NOT_MASK_LAST)
  33. end
  34. function _M.packet_parser(header)
  35. if #header ~= consts.T1K_HEADER_SIZE then
  36. return true, nil, 0
  37. end
  38. local fb = header:byte(1, 1)
  39. local finished = _M.is_mask_last(fb)
  40. local tag = tag_parser(fb)
  41. local length = _M.char_to_int_length(header:sub(2, 5))
  42. return finished, tag, length
  43. end
  44. function _M.starts_with(str, start)
  45. return str:sub(1, #start) == start
  46. end
  47. function _M.to_var_idx(o)
  48. local var = o
  49. local idx
  50. local _, p = o:find(":")
  51. if p then
  52. var = o:sub(1, p - 1)
  53. idx = tonumber(o:sub(p + 1))
  54. end
  55. var = re_gsub(var:lower(), "-", "_")
  56. if not _M.starts_with(var, consts.NGX_HTTP_HEADER_PREFIX) then
  57. var = consts.NGX_HTTP_HEADER_PREFIX .. var
  58. end
  59. return var, idx
  60. end
  61. function _M.get_indexed_element(str, idx)
  62. if not str or not idx or idx == 0 then
  63. return str
  64. end
  65. local it, err = re_gmatch(str, [[([^,\s]+)]], "jo")
  66. if err then
  67. return nil
  68. end
  69. local t = {}
  70. for m, e in it do
  71. if e then
  72. return nil
  73. end
  74. table.insert(t, m[1])
  75. end
  76. local len = #t
  77. if len < abs(idx) then
  78. return nil
  79. end
  80. return t[idx > 0 and idx or (len + idx + 1)]
  81. end
  82. function _M.get_event_id(str)
  83. if not str then
  84. return nil
  85. end
  86. local m, err = re_match(str, [[<!-- event_id: ([A-Za-z0-9]+)(?: TYPE: [a-zA-Z])? -->]], "jo")
  87. if err then
  88. return nil
  89. end
  90. if m then
  91. return m[1]
  92. end
  93. return nil
  94. end
  95. return _M