MXS-1725 Provide mech. for short-circuiting req. processing

Filter that terminate the response processing now have a mechanism
using which a response can be provided in such a way that previous
filters will see the response.
This commit is contained in:
Johan Wikman
2018-03-22 13:52:52 +02:00
parent 81708e0ba2
commit 9fd64cf7ba
2 changed files with 69 additions and 0 deletions

View File

@ -62,6 +62,7 @@ static MXS_SESSION *session_find_free();
static void session_final_free(MXS_SESSION *session);
static MXS_SESSION* session_alloc_body(SERVICE* service, DCB* client_dcb,
MXS_SESSION* session);
static void session_deliver_response(MXS_SESSION* session);
/**
* The clientReply of the session.
@ -720,6 +721,10 @@ bool session_route_query(MXS_SESSION* session, GWBUF* buffer)
rv = false;
}
// In case some filter has short-circuited the request processing we need
// to deliver that now to the client.
session_deliver_response(session);
return rv;
}
@ -1223,3 +1228,51 @@ bool session_remove_variable(MXS_SESSION* session,
return removed;
}
void session_set_response(MXS_SESSION *session, MXS_UPSTREAM *up, GWBUF *buffer)
{
// Valid arguments.
ss_dassert(session && up && buffer);
// Valid state. Only one filter may terminate the execution and exactly once.
ss_dassert(!session->response.up.instance &&
!session->response.up.session &&
!session->response.buffer);
session->response.up = *up;
session->response.buffer = buffer;
}
/**
* Delivers a provided response to the upstream filter that should
* receive it.
*
* @param session The session.
*/
static void session_deliver_response(MXS_SESSION* session)
{
MXS_FILTER* filter_instance = session->response.up.instance;
if (filter_instance)
{
MXS_FILTER_SESSION* filter_session = session->response.up.session;
GWBUF* buffer = session->response.buffer;
ss_dassert(filter_session);
ss_dassert(buffer);
session->response.up.clientReply(filter_instance, filter_session, buffer);
session->response.up.instance = NULL;
session->response.up.session = NULL;
session->response.up.clientReply = NULL;
session->response.up.error = NULL;
session->response.buffer = NULL;
}
ss_dassert(!session->response.up.instance);
ss_dassert(!session->response.up.session);
ss_dassert(!session->response.up.clientReply);
ss_dassert(!session->response.up.error);
ss_dassert(!session->response.buffer);
}