public HttpResponseMessage EngineReady() { var response = _mockEngine.Invoke("engineReady"); return(new HttpResponseMessage(response.StatusCode) { ReasonPhrase = response.ReasonPhrase }); }
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)); }