#include <haproxy/xxhash.h>
#include <haproxy/event_hdl.h>
-
+static inline int _srv_parse_exprs(struct server *srv, struct proxy *px, char **errmsg);
static void srv_update_status(struct server *s, int type, int cause);
static int srv_apply_lastaddr(struct server *srv, int *err_code);
static void srv_cleanup_connections(struct server *srv);
*
* Must be called with the server lock held.
*/
-void srv_set_ssl(struct server *s, int use_ssl)
+int srv_set_ssl(struct server *s, int use_ssl)
{
if (s->use_ssl == use_ssl)
- return;
+ return 0;
s->use_ssl = use_ssl;
- if (s->use_ssl)
+ if (s->use_ssl) {
+ if (_srv_parse_exprs(s, s->proxy, NULL))
+ return -1;
s->xprt = xprt_get(XPRT_SSL);
- else
+ }
+ else {
+ if (s->sni_expr && s->pool_conn_name && strcmp(s->sni_expr, s->pool_conn_name) == 0) {
+ release_sample_expr(s->pool_conn_name_expr);
+ s->pool_conn_name_expr = NULL;
+ }
s->xprt = xprt_get(XPRT_RAW);
+ }
+
+ return 0;
}
#endif /* USE_OPENSSL */
{
int ret = 0;
- /* Use sni as fallback if pool_conn_name isn't set */
- if (!srv->pool_conn_name && srv->sni_expr) {
- srv->pool_conn_name = strdup(srv->sni_expr);
- if (!srv->pool_conn_name) {
- memprintf(errmsg, "cannot duplicate sni expression (out of memory)");
- ret = ERR_ALERT | ERR_FATAL;
- goto out;
+ if (srv->use_ssl == 1) {
+ /* Use sni as fallback if pool_conn_name isn't set, but only if
+ * the server is configured to use SSL */
+ if (!srv->pool_conn_name && srv->sni_expr) {
+ srv->pool_conn_name = strdup(srv->sni_expr);
+ if (!srv->pool_conn_name) {
+ memprintf(errmsg, "cannot duplicate sni expression (out of memory)");
+ ret = ERR_ALERT | ERR_FATAL;
+ goto out;
+ }
}
}
- if (srv->sni_expr) {
+ if (srv->sni_expr && !srv->ssl_ctx.sni) {
ret = parse_srv_expr(srv->sni_expr, &srv->ssl_ctx.sni, px, errmsg);
if (ret)
goto out;
}
- if (srv->pool_conn_name) {
+ if (srv->pool_conn_name && !srv->pool_conn_name_expr) {
ret = parse_srv_expr(srv->pool_conn_name, &srv->pool_conn_name_expr, px, errmsg);
if (ret)
goto out;
}
else if (strcmp(args[3], "ssl") == 0) {
#ifdef USE_OPENSSL
+ char *err = NULL;
+
if (sv->flags & SRV_F_DYNAMIC) {
cli_err(appctx, "'set server <srv> ssl' not supported on dynamic servers\n");
goto out;
HA_SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (strcmp(args[4], "on") == 0) {
- srv_set_ssl(sv, 1);
+ if (srv_set_ssl(sv, 1)) {
+ cli_dynerr(appctx, memprintf(&err, "failed to enable ssl for server %s.\n", args[2]));
+ goto out;
+ }
} else if (strcmp(args[4], "off") == 0) {
- srv_set_ssl(sv, 0);
+ if (srv_set_ssl(sv, 0)) {
+ cli_dynerr(appctx, memprintf(&err, "failed to disable ssl for server %s.\n", args[2]));
+ goto out;
+ }
} else {
HA_SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
cli_err(appctx, "'set server <srv> ssl' expects 'on' or 'off'.\n");