Jeremy Rouet
05/06/2020, 5:00 PMimport io.ktor.application.ApplicationCall
import io.ktor.request.header
import kotlinx.coroutines.asContextElement
const val TENANT_HEADER_VALUE = "tenantID";
const val TENANT_HEADER_URL_VALUE = "tenantURL";
const val CLIENT_HEADER_URL_VALUE = "clientURL";
const val TENANTID_DEFAULT_VALUE = "master"
object ContextManager {
private val context = ThreadLocal<Context>();
/**
* Register a request in the context
*/
fun registerCall(call: ApplicationCall) {
var requestContext = getContext();
var tenantID = call.request.header(TENANT_HEADER_VALUE);
LOGGER.trace("Find ${tenantID} in ${call.request.headers}")
if (tenantID == null || tenantID.isEmpty()) {
tenantID = TENANTID_DEFAULT_VALUE;
}
requestContext.tenantID = tenantID;
requestContext.tenantUrl = call.request.header(TENANT_HEADER_URL_VALUE).toString();
requestContext.clientURL = call.request.header(CLIENT_HEADER_URL_VALUE).toString();
setContext(requestContext);
}
fun setContext(context: Context) {
this.context.set(context);
this.context.asContextElement(context);
}
fun getContext(): Context {
var requestContext = context.get();
if (requestContext == null) {
requestContext = Context()
}
return requestContext;
}
fun declareContext(tenantID: String, tenantUrl: String = "", clientURL: String = "") {
val requestContext = getContext();
requestContext.tenantUrl = tenantUrl;
requestContext.tenantID = tenantID;
requestContext.clientURL = clientURL;
}
}
class Context {
var tenantID = TENANTID_DEFAULT_VALUE;
var tenantUrl = "";
var clientURL = "";
}
cab
05/06/2020, 7:51 PMJeremy Rouet
05/06/2020, 7:52 PMcab
05/06/2020, 7:54 PMasync
and after it you might be executing in different threads.Jeremy Rouet
05/06/2020, 9:15 PMDavid Eriksson
05/07/2020, 6:21 AMthreadLocalContext.asContextElement()
Lots of things called context in your example šJeremy Rouet
05/07/2020, 1:22 PM