in aspnet/Microsoft.Samples.XMLA.HTTP/Microsoft.Samples.XMLA.HTTP.Proxy/Controllers/QueryController.cs [123:231]
private async Task<IActionResult> GetQueryResult(string database, string query, bool gzip, CancellationToken cancel)
{
if (string.IsNullOrEmpty(database))
{
throw new ArgumentException("Database not specified in route and no default database configured");
}
var req = this.Request;
//Authenticate the request
var authData = new AuthData(req);
if (authData.Scheme == AuthScheme.NONE && !config.IsSSAS)
{
var bearerHeader = new AuthenticationHeaderValue("Bearer", @"realm=""*.asazure.windows.net""");
//WWW-Authenticate: Basic realm="Access to staging site"
if (req.IsHttps)
{
var basicHeader = new AuthenticationHeaderValue("Basic", @"realm=""*.asazure.windows.net""");
return new UnauthorizedResultWithAuthenticationheader(bearerHeader, basicHeader);
}
log.LogInformation("Returning 401 Authrorization Challenge");
return new UnauthorizedResultWithAuthenticationheader(bearerHeader);
}
if (authData.Scheme == AuthScheme.BASIC && !req.IsHttps)
{
//If behind a gateway with SSL Terminiation this might be OK.
log.LogInformation("Rejecting HTTP Basic Auth over non-encryted connection.");
return BadRequest("HTTP Basic Auth only supported with https requests.");
}
var server = config.Server;
var tenantId = config.TenantId;
string constr = await tokenHelper.GetConnectionString(authData, server, database, tenantId);
ConnectionPoolEntry con;
try
{
con = pool.GetConnection(constr, authData);
}
catch (Exception ex)
{
if (ex is TargetInvocationException tex)
{
ex = tex.InnerException;
}
var msg = ex.Message;
var cs = constr.Split(";");
var sb = new StringBuilder();
foreach (var c in cs)
{
if (c.Trim().StartsWith("password", StringComparison.InvariantCultureIgnoreCase))
{
sb.Append("password=********").Append(";");
}
else
{
sb.Append(c).Append(";");
}
}
log.LogError($"Failed to get ADODB connection for connection string: {msg}: {sb.ToString()}");
return this.Problem("Failed to get ADODB connection for connection string. See server log for details.");
}
var cmd = con.Connection.CreateCommand();
cmd.CommandText = query;
object queryResults;
try
{
cmd.CommandTimeout = 2 * 60;
var reg = cancel.Register(() =>
{
cmd.Cancel();
con.Connection.Dispose();
log.LogInformation("Query Execution Canceled by Controller's Cancellation Token");
});
queryResults = cmd.Execute();
reg.Unregister();
}
catch (Exception ex)
{
log.LogError($"Query Execution Error Connection Pool Entry {con}: Exception {ex}");
return Problem(ex.Message);
}
if (queryResults is AdomdDataReader rdr)
{
return new QueryResult(rdr, gzip, false, con, pool, log);
}
else
{
return BadRequest($"Query execution returned unsupported result type {queryResults.GetType().Name}. Must be AdomdDataReader.");
}
}