]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add HTTP backend to metadata exporter 1117/head
authorAndrew Lewis <nerf@judo.za.org>
Thu, 10 Nov 2016 08:00:09 +0000 (10:00 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Thu, 10 Nov 2016 08:00:09 +0000 (10:00 +0200)
src/plugins/lua/metadata_exporter.lua

index eb463a2cad4ab5246aeec89909565f2a6e6f5e89..62fdc0d64550485f8638281408ad1c8971d728ca 100644 (file)
@@ -17,25 +17,33 @@ limitations under the License.
 
 -- A plugin that pushes metadata (or whole messages) to external services
 
+local rspamd_http
 local rspamd_logger = require "rspamd_logger"
 
 local settings = {
   format = function(task)
     return task:get_content()
   end,
+  mime_type = 'text/plain',
 }
 
 local opts = rspamd_config:get_all_opt('metadata_exporter')
 if not opts then return end
-local redis_params = rspamd_parse_redis_server('metadata_exporter')
-if not redis_params then
-  rspamd_logger.errx(rspamd_config, 'no servers are specified, disabling module')
-  return
-end
+local redis_params
 local channel = opts['channel']
-if not channel then
-  rspamd_logger.errx(rspamd_config, 'no channel is specified, disabling module')
-  return
+local url = opts['url']
+if not (url or channel) then
+  rspamd_logger.errx('No backends configured')
+end
+if channel then
+  redis_params = rspamd_parse_redis_server('metadata_exporter')
+  if not redis_params then
+    rspamd_logger.errx(rspamd_config, 'No redis servers are specified')
+    return
+  end
+end
+if url then
+  rspamd_http = require "rspamd_http"
 end
 if opts['select'] then
   settings.select = assert(loadstring(opts['select']))()
@@ -43,9 +51,20 @@ end
 if opts['format'] then
   settings.format = assert(loadstring(opts['format']))()
 end
+if opts['mime_type'] then
+  settings['mime_type'] = opts['mime_type']
+end
 
 local function metadata_exporter(task)
   local ret,conn,upstream
+  local function http_callback(err, code, body, headers)
+    if err then
+      rspamd_logger.errx(task, 'got error %s in http callback', err)
+    end
+    if code ~= 200 then
+      rspamd_logger.errx(task, 'got unexpected http status: %s', code)
+    end
+  end
   local function redis_set_cb(err, data)
     if err then
       rspamd_logger.errx(task, 'got error %s when publishing record on server %s',
@@ -64,14 +83,25 @@ local function metadata_exporter(task)
     rspamd_logger.debugx(task, 'Format returned non-truthy value: %1', data)
     return
   end
-  ret,conn,upstream = rspamd_redis_make_request(task,
-    redis_params, -- connect params
-    nil, -- hash key
-    true, -- is write
-    redis_set_cb, --callback
-    'PUBLISH', -- command
-    {channel, data} -- arguments
-  )
+  if channel then
+    ret,conn,upstream = rspamd_redis_make_request(task,
+      redis_params, -- connect params
+      nil, -- hash key
+      true, -- is write
+      redis_set_cb, --callback
+      'PUBLISH', -- command
+      {channel, data} -- arguments
+    )
+  end
+  if url then
+    rspamd_http.request({
+      task=task,
+      url=url,
+      body=data,
+      callback=http_callback,
+      mime_type=settings['mime_type'],
+    })
+  end
 end
 
 rspamd_config:register_symbol({