You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

http.lua 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. local rspamd_http = require "rspamd_http"
  2. local rspamd_logger = require "rspamd_logger"
  3. local function http_symbol(task)
  4. local url = tostring(task:get_request_header('url'))
  5. local method = tostring(task:get_request_header('method'))
  6. task:insert_result('method_' .. method, 1.0)
  7. local function http_callback(err, code, body)
  8. if err then
  9. rspamd_logger.errx('http_callback error: ' .. err)
  10. task:insert_result('HTTP_ERROR', 1.0, err)
  11. else
  12. task:insert_result('HTTP_' .. code, 1.0, body)
  13. end
  14. end
  15. local function http_dns_callback(err, code, body)
  16. if err then
  17. rspamd_logger.errx('http_dns_callback error: ' .. err)
  18. task:insert_result('HTTP_DNS_ERROR', 1.0, err)
  19. else
  20. task:insert_result('HTTP_DNS_' .. code, 1.0, body)
  21. end
  22. end
  23. rspamd_logger.errx(task, 'do http request with callback')
  24. rspamd_http.request({
  25. url = 'http://127.0.0.1:18080' .. url,
  26. task = task,
  27. method = method,
  28. callback = http_callback,
  29. timeout = 1,
  30. })
  31. --[[ request to this address involved DNS resolver subsystem ]]
  32. rspamd_logger.errx(task, 'do http request with callback + dns resolving')
  33. rspamd_http.request({
  34. url = 'http://site.resolveme:18080' .. url,
  35. task = task,
  36. method = method,
  37. callback = http_dns_callback,
  38. timeout = 1,
  39. })
  40. rspamd_logger.errx(task, 'rspamd_http.request[before]')
  41. local err, response = rspamd_http.request({
  42. url = 'http://127.0.0.1:18080' .. url,
  43. task = task,
  44. method = method,
  45. timeout = 1,
  46. })
  47. rspamd_logger.errx(task, 'rspamd_http.request[done] err: %1 response:%2', err, response)
  48. if not err then
  49. task:insert_result('HTTP_CORO_' .. response.code, 1.0, response.content)
  50. else
  51. task:insert_result('HTTP_CORO_ERROR', 1.0, err)
  52. end
  53. rspamd_logger.errx(task, 'do http request after coroutine finished')
  54. err, response = rspamd_http.request({
  55. url = 'http://site.resolveme:18080' .. url,
  56. task = task,
  57. method = method,
  58. timeout = 1,
  59. })
  60. if not err then
  61. task:insert_result('HTTP_CORO_DNS_' .. response.code, 1.0, response.content)
  62. else
  63. task:insert_result('HTTP_CORO_DNS_ERROR', 1.0, err)
  64. end
  65. end
  66. local function finish(task)
  67. rspamd_logger.errx('function finish')
  68. local err, response = rspamd_http.request({
  69. url = 'http://site.resolveme:18080/timeout',
  70. task = task,
  71. method = 'get',
  72. timeout = 1,
  73. })
  74. if err then
  75. task:insert_result('HTTP_CORO_DNS_FINISH_ERROR', 1.0, err)
  76. else
  77. task:insert_result('HTTP_CORO_DNS_FINISH_' .. response.code, 1.0, response.content)
  78. end
  79. end
  80. local function periodic(cfg, ev_base)
  81. local err, response = rspamd_http.request({
  82. url = 'http://site.resolveme:18080/request/periodic',
  83. config = cfg,
  84. })
  85. if err then
  86. rspamd_logger.errx('periodic err ' .. err)
  87. else
  88. rspamd_logger.errx('periodic success ' .. response.content)
  89. end
  90. return false
  91. end
  92. rspamd_config:register_symbol({
  93. name = 'SIMPLE_HTTP_TEST',
  94. score = 1.0,
  95. callback = http_symbol,
  96. no_squeeze = true,
  97. flags = 'coro'
  98. })
  99. local function http_large_symbol(task)
  100. if task:get_queue_id() == 'SSL Large HTTP request' then
  101. local data = {}
  102. for i = 1,2 do
  103. local st = {}
  104. for j=1,300000 do
  105. st[j] = 't'
  106. end
  107. data[i] = table.concat(st)
  108. end
  109. data[#data + 1] = '\n'
  110. local function http_callback(err, code, body)
  111. if err then
  112. rspamd_logger.errx('http_callback error: ' .. err)
  113. task:insert_result('HTTP_ERROR', 1.0, err)
  114. else
  115. task:insert_result('HTTP_SSL_LARGE', 1.0)
  116. end
  117. end
  118. rspamd_http.request({
  119. url = 'https://127.0.0.1:18081/',
  120. task = task,
  121. method = 'post',
  122. callback = http_callback,
  123. timeout = 10,
  124. body = data,
  125. no_ssl_verify = true,
  126. })
  127. end
  128. end
  129. rspamd_config:register_symbol({
  130. name = 'LARGE_HTTP_TEST',
  131. score = 1.0,
  132. callback = http_large_symbol,
  133. no_squeeze = true,
  134. flags = 'coro'
  135. })
  136. rspamd_config:register_finish_script(finish)
  137. rspamd_config:add_on_load(function(cfg, ev_base, worker)
  138. local err, response = rspamd_http.request({
  139. url = 'http://site.resolveme:18080/request/add_on_load',
  140. config = cfg,
  141. })
  142. if err then
  143. rspamd_logger.errx('add_on_load err ' .. err)
  144. else
  145. rspamd_logger.errx('add_on_load success ' .. response.content)
  146. end
  147. rspamd_config:add_periodic(ev_base, 0, periodic, false)
  148. end)