private static Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
            var code = HttpStatusCode.InternalServerError;

            context.Response.ContentType = "application/json";
            context.Response.StatusCode  = (int)code;

            var result = new List <string>()
            {
                ex.Message
            };

            var errorDetails = new ErrorDetailsResponse((int)code, "Internal Server Error", result);

            return(context.Response.WriteAsync(errorDetails.ToJson()));
        }
 /// <param name='operationStatusLink'>
 /// Required. Location value returned by the Begin operation.
 /// </param>
 /// <param name='cancellationToken'>
 /// Cancellation token.
 /// </param>
 /// <returns>
 /// The test result of the input or output data source.
 /// </returns>
 public async Task<DataSourceTestConnectionResponse> GetTestConnectionStatusAsync(string operationStatusLink, CancellationToken cancellationToken)
 {
     // Validate
     if (operationStatusLink == null)
     {
         throw new ArgumentNullException("operationStatusLink");
     }
     
     // Tracing
     bool shouldTrace = TracingAdapter.IsEnabled;
     string invocationId = null;
     if (shouldTrace)
     {
         invocationId = TracingAdapter.NextInvocationId.ToString();
         Dictionary<string, object> tracingParameters = new Dictionary<string, object>();
         tracingParameters.Add("operationStatusLink", operationStatusLink);
         TracingAdapter.Enter(invocationId, this, "GetTestConnectionStatusAsync", tracingParameters);
     }
     
     // Construct URL
     string url = "";
     url = url + operationStatusLink;
     url = url.Replace(" ", "%20");
     
     // Create HTTP transport objects
     HttpRequestMessage httpRequest = null;
     try
     {
         httpRequest = new HttpRequestMessage();
         httpRequest.Method = HttpMethod.Get;
         httpRequest.RequestUri = new Uri(url);
         
         // Set Headers
         httpRequest.Headers.Add("x-ms-client-request-id", Guid.NewGuid().ToString());
         httpRequest.Headers.Add("x-ms-version", "2014-12-01-preview");
         
         // Set Credentials
         cancellationToken.ThrowIfCancellationRequested();
         await this.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false);
         
         // Send Request
         HttpResponseMessage httpResponse = null;
         try
         {
             if (shouldTrace)
             {
                 TracingAdapter.SendRequest(invocationId, httpRequest);
             }
             cancellationToken.ThrowIfCancellationRequested();
             httpResponse = await this.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
             if (shouldTrace)
             {
                 TracingAdapter.ReceiveResponse(invocationId, httpResponse);
             }
             HttpStatusCode statusCode = httpResponse.StatusCode;
             if (statusCode != HttpStatusCode.OK && statusCode != HttpStatusCode.Accepted && statusCode != HttpStatusCode.NoContent && statusCode != HttpStatusCode.BadRequest)
             {
                 cancellationToken.ThrowIfCancellationRequested();
                 CloudException ex = CloudException.Create(httpRequest, null, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false));
                 if (shouldTrace)
                 {
                     TracingAdapter.Error(invocationId, ex);
                 }
                 throw ex;
             }
             
             // Create Result
             DataSourceTestConnectionResponse result = null;
             // Deserialize Response
             if (statusCode == HttpStatusCode.OK || statusCode == HttpStatusCode.Accepted || statusCode == HttpStatusCode.NoContent || statusCode == HttpStatusCode.BadRequest)
             {
                 cancellationToken.ThrowIfCancellationRequested();
                 string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
                 result = new DataSourceTestConnectionResponse();
                 JToken responseDoc = null;
                 if (string.IsNullOrEmpty(responseContent) == false)
                 {
                     responseDoc = JToken.Parse(responseContent);
                 }
                 
                 if (responseDoc != null && responseDoc.Type != JTokenType.Null)
                 {
                     JToken statusValue = responseDoc["status"];
                     if (statusValue != null && statusValue.Type != JTokenType.Null)
                     {
                         string statusInstance = ((string)statusValue);
                         result.DataSourceTestStatus = statusInstance;
                     }
                     
                     JToken errorValue = responseDoc["error"];
                     if (errorValue != null && errorValue.Type != JTokenType.Null)
                     {
                         ErrorResponse errorInstance = new ErrorResponse();
                         result.Error = errorInstance;
                         
                         JToken codeValue = errorValue["code"];
                         if (codeValue != null && codeValue.Type != JTokenType.Null)
                         {
                             string codeInstance = ((string)codeValue);
                             errorInstance.Code = codeInstance;
                         }
                         
                         JToken messageValue = errorValue["message"];
                         if (messageValue != null && messageValue.Type != JTokenType.Null)
                         {
                             string messageInstance = ((string)messageValue);
                             errorInstance.Message = messageInstance;
                         }
                         
                         JToken detailsValue = errorValue["details"];
                         if (detailsValue != null && detailsValue.Type != JTokenType.Null)
                         {
                             ErrorDetailsResponse detailsInstance = new ErrorDetailsResponse();
                             errorInstance.Details = detailsInstance;
                             
                             JToken codeValue2 = detailsValue["code"];
                             if (codeValue2 != null && codeValue2.Type != JTokenType.Null)
                             {
                                 string codeInstance2 = ((string)codeValue2);
                                 detailsInstance.Code = codeInstance2;
                             }
                             
                             JToken messageValue2 = detailsValue["message"];
                             if (messageValue2 != null && messageValue2.Type != JTokenType.Null)
                             {
                                 string messageInstance2 = ((string)messageValue2);
                                 detailsInstance.Message = messageInstance2;
                             }
                         }
                     }
                 }
                 
             }
             result.StatusCode = statusCode;
             if (httpResponse.Headers.Contains("x-ms-request-id"))
             {
                 result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault();
             }
             if (statusCode == HttpStatusCode.NotFound)
             {
                 result.Status = OperationStatus.Failed;
             }
             if (statusCode == HttpStatusCode.BadRequest)
             {
                 result.Status = OperationStatus.Failed;
             }
             if (result.DataSourceTestStatus == DataSourceTestStatus.TestFailed)
             {
                 result.Status = OperationStatus.Failed;
             }
             if (result.DataSourceTestStatus == DataSourceTestStatus.TestSucceeded)
             {
                 result.Status = OperationStatus.Succeeded;
             }
             
             if (shouldTrace)
             {
                 TracingAdapter.Exit(invocationId, result);
             }
             return result;
         }
         finally
         {
             if (httpResponse != null)
             {
                 httpResponse.Dispose();
             }
         }
     }
     finally
     {
         if (httpRequest != null)
         {
             httpRequest.Dispose();
         }
     }
 }