MINOR: checks: Set by default expect rule status to UNKNOWN during parsing

The status (ok, error and timeout) of an TCP or HTTP expect rule are set to
HCHK_STATUS_UNKNOWN by default, when not specified, during the configuration
parsing. This does not change the default status used for a terminal expect rule
(ok=L7OK, err=L7RSP and tout=L7TOUT). But this way, it is possible to know if a
specific status was forced by config or not.
diff --git a/src/checks.c b/src/checks.c
index 1249b24..b7d365b 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -689,7 +689,8 @@
 		enum healthcheck_status tout = HCHK_STATUS_L7TOUT;
 
 		/* connection established but expired check */
-		if (check->current_step && check->current_step->action == TCPCHK_ACT_EXPECT)
+		if (check->current_step && check->current_step->action == TCPCHK_ACT_EXPECT &&
+		    check->current_step->expect.tout_status != HCHK_STATUS_UNKNOWN)
 			tout = check->current_step->expect.tout_status;
 		set_server_check_status(check, tout, err_msg);
 	}
@@ -1246,7 +1247,8 @@
 	 * FIXME : it can be cool to use MySQL Version for other purpose,
 	 * like mark as down old MySQL server.
 	 */
-	set_server_check_status(check, rule->expect.ok_status, b_peek(&check->bi, 5));
+	status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD);
+	set_server_check_status(check, status, b_peek(&check->bi, 5));
 
   out:
 	free_trash_chunk(msg);
@@ -1344,7 +1346,8 @@
 		goto error;
 	}
 
-	set_server_check_status(check, rule->expect.ok_status, "Success");
+	status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD);
+	set_server_check_status(check, status, "Success");
 
   out:
 	free_trash_chunk(msg);
@@ -1385,7 +1388,8 @@
 		goto error;
 	}
 
-	set_server_check_status(check, rule->expect.ok_status, "SPOA server is ok");
+	status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD);
+	set_server_check_status(check, status, "SPOA server is ok");
 
   out:
 	free_trash_chunk(msg);
@@ -2075,11 +2079,15 @@
 			goto wait_more_data;
 		}
 		if (is_empty) {
+			int status;
+
 			chunk_printf(&trash, "TCPCHK got an empty response at step %d",
 				     tcpcheck_get_step_id(check, rule));
 			if (rule->comment)
 				chunk_appendf(&trash, " comment: '%s'", rule->comment);
-			set_server_check_status(check, rule->expect.err_status, trash.area);
+
+			status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP);
+			set_server_check_status(check, status, trash.area);
 			goto stop;
 		}
 	}
@@ -2155,15 +2163,17 @@
 		}
 
 		/* Set status and description in case of error */
-		status = HCHK_STATUS_L7STS;
-		desc   = htx_sl_res_reason(sl);
+		status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7STS);
+		if (LIST_ISEMPTY(&expect->onerror_fmt))
+			desc = htx_sl_res_reason(sl);
 		break;
 	case TCPCHK_EXPECT_HTTP_REGEX_STATUS:
 		match = regex_exec2(expect->regex, HTX_SL_RES_CPTR(sl), HTX_SL_RES_CLEN(sl));
 
 		/* Set status and description in case of error */
-		status = HCHK_STATUS_L7STS;
-		desc   = htx_sl_res_reason(sl);
+		status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7STS);
+		if (LIST_ISEMPTY(&expect->onerror_fmt))
+			desc = htx_sl_res_reason(sl);
 		break;
 
 	case TCPCHK_EXPECT_HTTP_BODY:
@@ -2183,8 +2193,9 @@
 		if (!b_data(&trash)) {
 			if (!last_read)
 				goto wait_more_data;
-			status = HCHK_STATUS_L7RSP;
-			desc = ist("HTTP content check could not find a response body");
+			status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP);
+			if (LIST_ISEMPTY(&expect->onerror_fmt))
+				desc = ist("HTTP content check could not find a response body");
 			goto error;
 		}
 
@@ -2201,15 +2212,16 @@
 			match = regex_exec2(expect->regex, b_orig(&trash), b_data(&trash));
 
 		/* Set status and description in case of error */
-		status = HCHK_STATUS_L7RSP;
-		desc = (inverse
-			? ist("HTTP check matched unwanted content")
-			: ist("HTTP content check did not match"));
+		status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP);
+		if (LIST_ISEMPTY(&expect->onerror_fmt))
+			desc = (inverse
+				? ist("HTTP check matched unwanted content")
+				: ist("HTTP content check did not match"));
 		break;
 
 	default:
 		/* should never happen */
-		status = HCHK_STATUS_L7RSP;
+		status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP);
 		goto error;
 	}
 
@@ -2250,6 +2262,7 @@
 	enum tcpcheck_eval_ret ret = TCPCHK_EVAL_CONTINUE;
 	struct tcpcheck_expect *expect = &rule->expect;
 	struct buffer *msg = NULL;
+	enum healthcheck_status status;
 	int match, inverse;
 
 	last_read |= b_full(&check->bi);
@@ -2316,7 +2329,9 @@
 	msg = alloc_trash_chunk();
 	if (msg)
 		tcpcheck_expect_onerror_message(msg, check, rule, match, IST_NULL);
-	set_server_check_status(check, expect->err_status, (msg ? b_head(msg) : NULL));
+
+	status = ((rule->expect.err_status != HCHK_STATUS_UNKNOWN) ? rule->expect.err_status : HCHK_STATUS_L7RSP);
+	set_server_check_status(check, status, (msg ? b_head(msg) : NULL));
 	free_trash_chunk(msg);
 	ret = TCPCHK_EVAL_STOP;
 
@@ -2507,6 +2522,7 @@
 
 		if (rule->action == TCPCHK_ACT_EXPECT) {
 			struct buffer *msg;
+			enum healthcheck_status status;
 
 			if (check->server &&
 			    (check->server->proxy->options & PR_O_DISABLE404) &&
@@ -2519,8 +2535,8 @@
 			msg = alloc_trash_chunk();
 			if (msg)
 				tcpcheck_expect_onsuccess_message(msg, check, rule, IST_NULL);
-			set_server_check_status(check, rule->expect.ok_status,
-						(msg ? b_head(msg) : "(tcp-check)"));
+			status = ((rule->expect.ok_status != HCHK_STATUS_UNKNOWN) ? rule->expect.ok_status : HCHK_STATUS_L7OKD);
+			set_server_check_status(check, status, (msg ? b_head(msg) : "(tcp-check)"));
 			free_trash_chunk(msg);
 		}
 		else if (rule->action == TCPCHK_ACT_CONNECT) {
@@ -3955,9 +3971,9 @@
 	struct sample_expr *status_expr = NULL;
 	char *on_success_msg, *on_error_msg, *comment, *pattern;
 	enum tcpcheck_expect_type type = TCPCHK_EXPECT_UNDEF;
-	enum healthcheck_status ok_st = HCHK_STATUS_L7OKD;
-	enum healthcheck_status err_st = HCHK_STATUS_L7RSP;
-	enum healthcheck_status tout_st = HCHK_STATUS_L7TOUT;
+	enum healthcheck_status ok_st = HCHK_STATUS_UNKNOWN;
+	enum healthcheck_status err_st = HCHK_STATUS_UNKNOWN;
+	enum healthcheck_status tout_st = HCHK_STATUS_UNKNOWN;
 	long min_recv = -1;
 	int inverse = 0;
 
@@ -4086,12 +4102,7 @@
 				goto error;
 			}
 			cur_arg++;
-			free(on_success_msg);
-			on_success_msg = strdup(args[cur_arg]);
-			if (!on_success_msg) {
-				memprintf(errmsg, "out of memory");
-				goto error;
-			}
+			on_success_msg = args[cur_arg];
 		}
 		else if (strcmp(args[cur_arg], "on-error") == 0) {
 			if (in_pattern) {
@@ -4103,12 +4114,7 @@
 				goto error;
 			}
 			cur_arg++;
-			free(on_error_msg);
-			on_error_msg = strdup(args[cur_arg]);
-			if (!on_error_msg) {
-				memprintf(errmsg, "out of memory");
-				goto error;
-			}
+			on_error_msg = args[cur_arg];
 		}
 		else if (strcmp(args[cur_arg], "ok-status") == 0) {
 			if (in_pattern) {
@@ -4250,8 +4256,6 @@
 			memprintf(errmsg, "'%s' invalid log-format string (%s).\n", on_success_msg, *errmsg);
 			goto error;
 		}
-		free(on_success_msg);
-		on_success_msg = NULL;
 	}
 	if (on_error_msg) {
 		px->conf.args.ctx = ARGC_SRV;
@@ -4259,8 +4263,6 @@
 			memprintf(errmsg, "'%s' invalid log-format string (%s).\n", on_error_msg, *errmsg);
 			goto error;
 		}
-		free(on_error_msg);
-		on_error_msg = NULL;
 	}
 
 	switch (chk->expect.type) {
@@ -4353,8 +4355,6 @@
   error:
 	free_tcpcheck(chk, 0);
 	free(comment);
-	free(on_success_msg);
-	free(on_error_msg);
 	release_sample_expr(status_expr);
 	return NULL;
 }