# Timeout for messages processing (must be larger than any internal timeout used)
task_timeout = 8s;
+
+# Emit soft reject when timeout takes place
+soft_reject_on_timeout = false;
gboolean disable_pcre_jit; /**< Disable pcre JIT */
gboolean disable_lua_squeeze; /**< Disable lua rules squeezing */
gboolean own_lua_state; /**< True if we have created lua_state internally */
+ gboolean soft_reject_on_timeout; /**< If true emit soft reject on task timeout (if not reject) */
gsize max_cores_size; /**< maximum size occupied by rspamd core files */
gsize max_cores_count; /**< maximum number of core files */
gsize max_message; /**< maximum size for messages */
gsize max_pic_size; /**< maximum size for a picture to process */
gsize images_cache_size; /**< size of LRU cache for DCT data from images */
- gint default_max_shots; /**< default maximum count of symbols hits permitted (-1 for unlimited) */
gdouble task_timeout; /**< maximum message processing time */
+ gint default_max_shots; /**< default maximum count of symbols hits permitted (-1 for unlimited) */
enum rspamd_log_type log_type; /**< log type */
gint log_facility; /**< log facility in case of syslog */
G_STRUCT_OFFSET (struct rspamd_config, task_timeout),
RSPAMD_CL_FLAG_TIME_FLOAT,
"Maximum time for checking a message");
+ rspamd_rcl_add_default_handler (sub,
+ "soft_reject_on_timeout",
+ rspamd_rcl_parse_struct_boolean,
+ G_STRUCT_OFFSET (struct rspamd_config, soft_reject_on_timeout),
+ 0,
+ "Emit soft reject if task timeout takes place");
rspamd_rcl_add_default_handler (sub,
"check_timeout",
rspamd_rcl_parse_struct_time,
if (!(task->processed_stages & RSPAMD_TASK_STAGE_FILTERS)) {
msg_info_task ("processing of task timed out, forced processing");
+
+ if (task->cfg->soft_reject_on_timeout) {
+ struct rspamd_metric_result *res = task->result;
+
+ if (rspamd_check_action_metric (task, res) != METRIC_ACTION_REJECT) {
+ rspamd_add_passthrough_result (task,
+ METRIC_ACTION_SOFT_REJECT,
+ 0,
+ NAN,
+ "timeout processing message",
+ "task timeout");
+
+ ucl_object_replace_key (task->messages,
+ ucl_object_fromstring_common ("timeout processing message",
+ 0, UCL_STRING_RAW),
+ "smtp_message", 0,
+ false);
+ }
+ }
+
task->processed_stages |= RSPAMD_TASK_STAGE_FILTERS;
rspamd_session_cleanup (task->s);
rspamd_task_process (task, RSPAMD_TASK_PROCESS_ALL);