示例#1
0
        public HttpResponseMessage EngineReady()
        {
            var response = _mockEngine.Invoke("engineReady");

            return(new HttpResponseMessage(response.StatusCode)
            {
                ReasonPhrase = response.ReasonPhrase
            });
        }
示例#2
0
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (_settings.Enabled)
            {
                try
                {
                    var pathAndQuery = request.RequestUri.PathAndQuery;
                    if (_whenMatcher != null)
                    {
                        var match = _whenMatcher.Match(pathAndQuery);
                        if (match.Success)
                        {
                            var scenario = _mockEngine.FindScenario(pathAndQuery, request.Method.Method);

                            if (scenario == null)
                            {
                                return(await base.SendAsync(request, cancellationToken));
                            }

                            var dynamicParameters = new ExpandoObject();

                            var headers = new DynamicNameValueCollection();
                            headers.AddHeaders(request.Headers);
                            dynamicParameters.AddProperty("Headers", headers);

                            dynamicParameters.AddProperty("Request", request);

                            foreach (var pathParameter in scenario.PathParameters)
                            {
                                dynamicParameters.AddProperty(pathParameter.Key, pathParameter.Value);
                            }

                            foreach (var property in request.Properties)
                            {
                                dynamicParameters.AddProperty(property.Key, property.Value);
                            }

                            var parameters = request.RequestUri.ParseQueryString();

                            foreach (string parameterName in parameters)
                            {
                                dynamicParameters.AddProperty(parameterName, parameters[parameterName]);
                            }

                            if (request.Content.Headers.ContentType != null)
                            {
                                var contentType = request.Content.Headers.ContentType.MediaType;
                                if (contentType == "application/xml" || contentType == "text/xml")
                                {
                                    if (scenario.RequestType == typeof(DynamicObject))
                                    {
                                        var content = await request.Content.ReadAsStringAsync();

                                        if (!string.IsNullOrWhiteSpace(content))
                                        {
                                            dynamicParameters.AddProperty(scenario.RequestParameterName, DynamicXml.Parse(content));
                                        }
                                    }
                                    else
                                    {
                                        var contentGraph = await request.Content.ReadAsAsync(scenario.RequestType);

                                        dynamicParameters.AddProperty(scenario.RequestParameterName, contentGraph);
                                    }
                                }
                                else if (contentType == "application/yaml")
                                {
                                    // TBD: Note that I should be able to do this with the YamlMediaTypeFormatter
                                    // but it is currently being ignored
                                    var content = await request.Content.ReadAsStringAsync();

                                    if (scenario.RequestType == typeof(DynamicObject))
                                    {
                                        dynamicParameters.AddProperty(scenario.RequestParameterName, content.DeserializeYaml <object>());
                                    }
                                    else
                                    {
                                        dynamicParameters.AddProperty(scenario.RequestParameterName, content.DeserializeYaml(scenario.RequestType));
                                    }
                                }
                                else
                                {
                                    var contentGraph = await request.Content.ReadAsAsync(scenario.RequestType);

                                    dynamicParameters.AddProperty(scenario.RequestParameterName, contentGraph);
                                }
                            }
                            var result = _mockEngine.Invoke(scenario.Name, dynamicParameters);
                            if (result.Success)
                            {
                                var response = new HttpResponseMessage(result.StatusCode)
                                {
                                    ReasonPhrase = result.ReasonPhrase
                                };
                                response.RequestMessage = request;
                                if (result.Content != null)
                                {
                                    Type contentType = result.Content.GetType();
                                    if (WillAcceptType(request.Headers.Accept, "application/xml"))
                                    {
                                        response.Content = new StringContent(SerializeAsXml(result.Content, Encoding.UTF8), Encoding.UTF8, "application/xml");
                                    }
                                    else if (WillAcceptType(request.Headers.Accept, "application/json"))
                                    {
                                        response.Content = new ObjectContent(contentType, result.Content, new JsonMediaTypeFormatter(), "application/json");
                                    }
                                    else if (WillAcceptType(request.Headers.Accept, "application/yaml") || WillAcceptType(request.Headers.Accept, "*/*"))
                                    {
                                        response.Content = new ObjectContent(contentType, result.Content, new YamlMediaTypeFormatter(), "application/yaml");
                                    }
                                    else
                                    {
                                        response.Content      = new StringContent("response media type is not supported");
                                        response.StatusCode   = HttpStatusCode.UnsupportedMediaType;
                                        response.ReasonPhrase = "response media type is not supported";
                                    }
                                }
                                return(response);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Trace.WriteLine(e);
                    var reasonPhrase = e.Message.Replace("\n", " ").Replace("\r", " "); //cannot contain new lines
                    var response     = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                    {
                        ReasonPhrase = reasonPhrase
                    };
                    response.RequestMessage = request;
                    response.Content        = new StringContent(e.ToString(), Encoding.UTF8, "text/plain");
                    return(response);
                }
            }
            return(await base.SendAsync(request, cancellationToken));
        }