Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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);
        }