protected override async Task <HttpResponseMessage> SendAsync(
            HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            var response = await base.SendAsync(request, cancellationToken);

            RunnableClientSampleMethod runnableMethod = ClientSampleContext.CurrentRunnableMethod;

            if (runnableMethod != null)
            {
                bool suppressOutput;
                if (!ClientSampleContext.CurrentContext.TryGetValue <bool>(PropertySuppressOutput, out suppressOutput))
                {
                    suppressOutput = false;
                }

                string operationName;
                if (!ClientSampleContext.CurrentContext.TryGetValue <string>(PropertyOperationName, out operationName))
                {
                    operationName = ClientSampleContext.CurrentRunnableMethod.MethodBase.Name;
                }
                else
                {
                    // TODO: add validation around the operation name
                }

                if (!suppressOutput)
                {
                    DirectoryInfo baseOutputPath;
                    if (ClientSampleContext.CurrentContext.TryGetValue <DirectoryInfo>(PropertyOutputFilePath, out baseOutputPath))
                    {
                        Dictionary <string, string> requestHeaders  = ProcessHeaders(request.Headers);
                        Dictionary <string, string> responseHeaders = ProcessHeaders(response.Headers);

                        dynamic requestBody = null;
                        try
                        {
                            string requestBodyString = await request.Content.ReadAsStringAsync();

                            if (!String.IsNullOrEmpty(requestBodyString))
                            {
                                requestBody = JValue.Parse(requestBodyString);
                            }
                        }
                        catch (Exception) { }

                        JObject responseBody = null;
                        try
                        {
                            if (IsJsonResponse(response))
                            {
                                string responseBodyString = await response.Content.ReadAsStringAsync();

                                responseBody = JObject.Parse(responseBodyString);
                            }
                        }
                        catch (Exception) { }

                        ApiResponseMetadata responseData = new ApiResponseMetadata()
                        {
                            Body    = responseBody,
                            Headers = responseHeaders
                        };

                        Dictionary <string, object> requestParameters = new Dictionary <string, object>();

                        // Add the request body (if there is one)
                        if (requestBody != null)
                        {
                            requestParameters["body"] = requestBody;
                        }

                        // Add query parameters (if any)
                        if (!String.IsNullOrEmpty(request.RequestUri.Query))
                        {
                            NameValueCollection queryParams = HttpUtility.ParseQueryString(request.RequestUri.Query);
                            foreach (string param in queryParams.Keys)
                            {
                                requestParameters[param] = queryParams[param];
                            }
                        }

                        // Add request headers
                        foreach (var rh in requestHeaders)
                        {
                            // Look for api-version
                            if (rh.Key.Equals("Accept") && rh.Value.Contains("api-version="))
                            {
                                int s = rh.Value.IndexOf("api-version=") + "api-version=".Length;
                                int e = rh.Value.IndexOf(';', s);
                                requestParameters.Add("api-version", e != -1 ? rh.Value.Substring(s, e) : rh.Value.Substring(s));
                            }
                            else
                            {
                                requestParameters.Add(rh.Key, rh.Value);
                            }
                        }

                        // Add sample account name if "account" parameter not already set
                        if (!requestParameters.ContainsKey("account"))
                        {
                            requestParameters["account"] = "fabrikam";
                        }

                        ApiRequestResponseMetdata data = new ApiRequestResponseMetdata()
                        {
                            Area       = runnableMethod.Area,
                            Resource   = runnableMethod.Resource,
                            HttpMethod = request.Method.ToString().ToUpperInvariant(),
                            RequestUrl = request.RequestUri.ToString(),
                            Parameters = requestParameters,
                            Responses  = new Dictionary <string, ApiResponseMetadata>()
                            {
                                { ((int)response.StatusCode).ToString(), responseData }
                            },
                            Generated     = true,
                            GeneratedDate = DateTime.Now
                        };

                        string outputPath     = Path.Combine(baseOutputPath.FullName, char.ToLower(data.Area[0]) + data.Area.Substring(1), char.ToLower(data.Resource[0]) + data.Resource.Substring(1));
                        string outputFileName = operationName + ".json";

                        DirectoryInfo outputDirectory = Directory.CreateDirectory(outputPath);

                        string outputFile = Path.Combine(outputDirectory.FullName, outputFileName);

                        string output = JsonConvert.SerializeObject(data, this.serializerSettings);

                        File.WriteAllText(outputFile, output);
                    }
                }
            }

            return(response);
        }
        protected override async Task <HttpResponseMessage> SendAsync(
            HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            var response = await base.SendAsync(request, cancellationToken);

            RunnableClientSampleMethod runnableMethod = ClientSampleContext.CurrentRunnableMethod;

            if (runnableMethod != null)
            {
                bool suppressOutput;
                if (!ClientSampleContext.CurrentContext.TryGetValue <bool>(PropertySuppressOutput, out suppressOutput))
                {
                    suppressOutput = false;
                }

                string operationName;
                if (!ClientSampleContext.CurrentContext.TryGetValue <string>(PropertyOperationName, out operationName))
                {
                    operationName = ClientSampleContext.CurrentRunnableMethod.MethodBase.Name;
                }
                else
                {
                    // TODO: add validation around the operation name
                }

                if (!suppressOutput)
                {
                    DirectoryInfo baseOutputPath;
                    if (ClientSampleContext.CurrentContext.TryGetValue <DirectoryInfo>(PropertyOutputFilePath, out baseOutputPath))
                    {
                        Dictionary <string, string> requestHeaders = new Dictionary <string, string>();
                        foreach (var h in request.Headers.Where(kvp => { return(!s_excludedHeaders.Contains(kvp.Key)); }))
                        {
                            requestHeaders[h.Key] = h.Value.First();
                        }

                        Dictionary <string, string> responseHeaders = new Dictionary <string, string>();

                        foreach (var h in response.Headers.Where(kvp => { return(!s_excludedHeaders.Contains(kvp.Key)); }))
                        {
                            responseHeaders[h.Key] = h.Value.First();
                        }

                        JObject requestBody = null;
                        try
                        {
                            string requestBodyString = await request.Content.ReadAsStringAsync();

                            if (!String.IsNullOrEmpty(requestBodyString))
                            {
                                requestBody = JObject.Parse(requestBodyString);
                            }
                        }
                        catch (Exception) { }

                        JObject responseBody = null;
                        try
                        {
                            if (IsJsonResponse(response))
                            {
                                string responseBodyString = await response.Content.ReadAsStringAsync();

                                responseBody = JObject.Parse(responseBodyString);
                            }
                        }
                        catch (Exception) { }

                        ApiRequestResponseMetdata data = new ApiRequestResponseMetdata()
                        {
                            Area            = runnableMethod.Area,
                            Resource        = runnableMethod.Resource,
                            HttpMethod      = request.Method.ToString().ToUpperInvariant(),
                            RequestUrl      = request.RequestUri.ToString(),
                            RequestHeaders  = requestHeaders,
                            RequestBody     = requestBody,
                            StatusCode      = (int)response.StatusCode,
                            ResponseHeaders = responseHeaders,
                            ResponseBody    = responseBody
                        };

                        string outputPath     = Path.Combine(baseOutputPath.FullName, data.Area, data.Resource);
                        string outputFileName = operationName + ".json";

                        DirectoryInfo outputDirectory = Directory.CreateDirectory(outputPath);

                        string outputFile = Path.Combine(outputDirectory.FullName, outputFileName);

                        string output = JsonConvert.SerializeObject(data, this.serializerSettings);

                        File.WriteAllText(outputFile, output);
                    }
                }
            }

            return(response);
        }
Пример #3
0
        protected override async Task <HttpResponseMessage> SendAsync(
            HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            var response = await base.SendAsync(request, cancellationToken);

            RunnableClientSampleMethod runnableMethod = ClientSampleContext.CurrentRunnableMethod;

            if (runnableMethod != null)
            {
                bool suppressOutput;
                if (!ClientSampleContext.CurrentContext.TryGetValue <bool>(PropertySuppressOutput, out suppressOutput))
                {
                    suppressOutput = false;
                }

                string operationName;
                if (!ClientSampleContext.CurrentContext.TryGetValue <string>(PropertyOperationName, out operationName))
                {
                    operationName = ClientSampleContext.CurrentRunnableMethod.MethodBase.Name;
                }
                else
                {
                    // TODO: add validation around the operation name
                }

                if (!suppressOutput)
                {
                    DirectoryInfo baseOutputPath;
                    if (ClientSampleContext.CurrentContext.TryGetValue <DirectoryInfo>(PropertyOutputFilePath, out baseOutputPath))
                    {
                        Dictionary <string, object> requestHeaders  = ProcessHeaders(request.Headers);
                        Dictionary <string, object> responseHeaders = ProcessHeaders(response.Headers);

                        dynamic requestBody = null;
                        try
                        {
                            string requestBodyString = await request.Content.ReadAsStringAsync();

                            if (!String.IsNullOrEmpty(requestBodyString))
                            {
                                requestBody = JValue.Parse(requestBodyString);
                            }
                        }
                        catch (Exception) { }

                        JObject responseBody = null;
                        try
                        {
                            if (IsJsonResponse(response))
                            {
                                string responseBodyString = await response.Content.ReadAsStringAsync();

                                responseBody = JObject.Parse(responseBodyString);
                            }
                        }
                        catch (Exception) { }

                        ApiResponseMetadata responseData = new ApiResponseMetadata()
                        {
                            Body    = responseBody,
                            Headers = responseHeaders
                        };

                        Dictionary <string, object> requestParameters = new Dictionary <string, object>
                        {
                            { "body", requestBody }
                        };
                        foreach (var rh in requestHeaders)
                        {
                            requestParameters.Add(rh.Key, rh.Value);
                        }

                        if (!requestParameters.ContainsKey("account"))
                        {
                            requestParameters["account"] = "fabrikam";
                        }

                        ApiRequestResponseMetdata data = new ApiRequestResponseMetdata()
                        {
                            Area       = runnableMethod.Area,
                            Resource   = runnableMethod.Resource,
                            HttpMethod = request.Method.ToString().ToUpperInvariant(),
                            RequestUrl = request.RequestUri.ToString(),
                            Parameters = requestParameters,
                            Responses  = new Dictionary <string, ApiResponseMetadata>()
                            {
                                { ((int)response.StatusCode).ToString(), responseData }
                            },
                            Generated     = true,
                            GeneratedDate = DateTime.Now
                        };

                        string outputPath     = Path.Combine(baseOutputPath.FullName, char.ToLower(data.Area[0]) + data.Area.Substring(1), char.ToLower(data.Resource[0]) + data.Resource.Substring(1));
                        string outputFileName = operationName + ".json";

                        DirectoryInfo outputDirectory = Directory.CreateDirectory(outputPath);

                        string outputFile = Path.Combine(outputDirectory.FullName, outputFileName);

                        string output = JsonConvert.SerializeObject(data, this.serializerSettings);

                        File.WriteAllText(outputFile, output);
                    }
                }
            }

            return(response);
        }