private async Task GetQueryResult()

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.");
            }
            

            
        }