private async Task <object> DeserializeBody(HttpWebResponse response) { var responseTypeName = response.Headers["X-Cqs-Object-Type"]; if (responseTypeName == null) { return(null); } var responseStream = response.GetResponseStream(); var reader = new StreamReader(responseStream); var responseJson = await reader.ReadToEndAsync(); var type = Type.GetType(responseTypeName, false); if (type == null) { throw new InvalidOperationException("Failed to load type " + responseTypeName); } return(CqsSerializer == null ? JsonConvert.DeserializeObject(responseJson, type) : CqsSerializer.Deserialize(type, responseJson)); }
private async Task <object> DoRequestAsync(string cqsType, string httpMethod, string uri, object cqsObject) { var json = cqsObject.ToString(); HttpWebResponse response = null; Exception innerException; string errorDescription = ""; try { var request = WebRequest.CreateHttp(uri); request.Method = httpMethod; request.Headers["X-Cqs-Object-Type"] = cqsObject.GetType().GetSimpleAssemblyQualifiedName(); request.Headers["X-Cqs-Type"] = cqsType; var contentType = "application/json;encoding=utf8"; json = CqsSerializer == null ? JsonConvert.SerializeObject(cqsObject) : CqsSerializer.Serialize(cqsObject, out contentType); request.ContentType = contentType; var jsonBuffer = Encoding.UTF8.GetBytes(json); var stream = await request.GetRequestStreamAsync(); stream.Write(jsonBuffer, 0, jsonBuffer.Length); stream.Close(); if (RequestDecorator != null) { RequestDecorator(request); } response = (HttpWebResponse)await request.GetResponseAsync(); return(await DeserializeBody(response)); } catch (Exception exception) { innerException = exception; var webEx = exception as WebException; if (webEx != null) { response = (HttpWebResponse)webEx.Response; if (response != null) { if (response.ContentLength > 0) { var stream = response.GetResponseStream(); var reader = new StreamReader(stream, Encoding.UTF8); errorDescription = reader.ReadToEnd(); } if (response.StatusCode == HttpStatusCode.NotFound) { return(null); } } } if (response == null) { throw new WebException(uri + " failed to process " + cqsObject.GetType().Name + " " + json + "\r\n" + errorDescription, exception); } } var ex = (Exception) await DeserializeBody(response); if (ex == null) { throw new Exception("Failed to handle " + json + "\r\n" + errorDescription, innerException); } throw ex; }
private void OnMessage(ITcpChannel channel, object message) { var request = (HttpRequest)message; if (_requestFilter != null) { var resp = _requestFilter(channel, request); if (resp != null) { channel.Send(resp); return; } } var name = request.Headers["X-Cqs-Type"]; var dotNetType = request.Headers["X-Cqs-Object-Type"]; var cqsName = request.Headers["X-Cqs-Name"]; if (Authenticator != null) { if (!AuthenticateUser(channel, request)) { return; } } var json = "{}"; if (request.Body != null) { var reader = new StreamReader(request.Body); json = reader.ReadToEnd(); } object cqsObject; if (!string.IsNullOrEmpty(dotNetType)) { cqsObject = _cqsObjectMapper.Deserialize(dotNetType, json); if (cqsObject == null) { var response = request.CreateResponse(); response.StatusCode = 400; response.ReasonPhrase = "Unknown type: " + dotNetType; Logger("Unknown type: " + dotNetType + " for " + request.Uri); channel.Send(response); return; } } else if (!string.IsNullOrEmpty(cqsName)) { cqsObject = _cqsObjectMapper.Deserialize(cqsName, json); if (cqsObject == null) { var response = request.CreateResponse(); response.StatusCode = 400; response.ReasonPhrase = "Unknown type: " + cqsName; Logger("Unknown type: " + cqsName + " for " + request.Uri); channel.Send(response); return; } } else { var response = request.CreateResponse(); response.StatusCode = 400; response.ReasonPhrase = "Expected a class name in the header 'X-Cqs-Name' or a .NET type name in the header 'X-Cqs-Object-Type'."; Logger( "Expected a class name in the header 'X-Cqs-Name' or a .NET type name in the header 'X-Cqs-Object-Type' for " + request.Uri); channel.Send(response); return; } ClientResponse cqsReplyObject = null; Exception ex = null; try { cqsReplyObject = _messageProcessor.ProcessAsync(cqsObject).Result; } catch (AggregateException e1) { ex = e1.InnerException; } if (ex is HttpException) { Logger("Failed to process " + json + ", Exception:\r\n" + ex); var response = request.CreateResponse(); response.StatusCode = ((HttpException)ex).HttpCode; response.ReasonPhrase = FirstLine(ex.Message); channel.Send(response); return; } if (ex is AuthorizationException) { Logger("Failed to process " + json + ", Exception:\r\n" + ex); var authEx = (AuthorizationException)ex; var response = request.CreateResponse(); response.StatusCode = 401; response.ReasonPhrase = FirstLine(ex.Message); channel.Send(response); return; } if (ex != null) { Logger("Failed to process " + json + ", Exception:\r\n" + ex); var response = request.CreateResponse(); response.StatusCode = 500; response.ReasonPhrase = FirstLine(ex.Message); channel.Send(response); return; } var reply = request.CreateResponse(); reply.ContentType = "application/json;encoding=utf8"; // for instance commands do not have a return value. if (cqsReplyObject.Body != null) { reply.AddHeader("X-Cqs-Object-Type", cqsReplyObject.Body.GetType().GetSimpleAssemblyQualifiedName()); reply.AddHeader("X-Cqs-Name", cqsReplyObject.Body.GetType().Name); if (cqsReplyObject.Body is Exception) { reply.StatusCode = 500; } var contentType = "application/json;encoding=utf8"; json = CqsSerializer == null ? SimpleJson.SerializeObject(cqsReplyObject.Body) : CqsSerializer.Serialize(cqsReplyObject.Body, out contentType); reply.ContentType = contentType; var buffer = Encoding.UTF8.GetBytes(json); reply.Body = new MemoryStream(); reply.Body.Write(buffer, 0, buffer.Length); } else { reply.StatusCode = (int)HttpStatusCode.NoContent; } channel.Send(reply); }