private bool MiddlesAccepted(ESBContext context, ResponseHandle responseHandle)
        {
            IMiddleHandle[] middles = ESBFactory.Instance.Middles;

            string msg  = null;
            int    code = 400;

            foreach (IMiddleHandle handle in middles)
            {
                if (!handle.CanHandle(context, out msg, out code))
                {
                    string json = ESBUtil.ParseJson(new
                    {
                        MiddleName = handle.GetType().FullName,
                        Message    = "O middle rejeitou a solicitação",
                        Url        = context.Url,
                        Detail     = msg
                    });

                    responseHandle.Write(ESBUtil.CreateBytes(json), code);
                    return(false);
                }
            }

            return(true);
        }
        public async Task Write(byte[] bytes, int httpCode, Dictionary <string, string> headers = null)
        {
            var Response = context.Response;

            Response.Clear();

            if (headers.TryGetValue("Content-Type", out string content))
            {
                Response.ContentType = content;
                headers.Remove("Content-Type");
            }

            if (headers.ContainsKey("Server"))
            {
                headers.Remove("Server");
            }

            if (headers.ContainsKey("Date"))
            {
                headers.Remove("Date");
            }

            if (headers.ContainsKey("Transfer-Encoding"))
            {
                headers.Remove("Transfer-Encoding");
            }

            if (headers != null && headers.Count > 0)
            {
                foreach (KeyValuePair <string, string> pair in headers)
                {
                    Response.GetTypedHeaders().Append(pair.Key, pair.Value);
                }
            }

            string body = ESBUtil.ConvertString(bytes);

            Response.StatusCode    = httpCode;
            Response.ContentLength = bytes.Length;

            await Response.WriteAsync(body);
        }
        public async Task Dispatch(ESBContext context,
                                   Inbound.ResponseHandle responseHandle)
        {
            try
            {
                //using (HttpClientHandler handler = new HttpClientHandler())
                //{
                //handler.ServerCertificateCustomValidationCallback = delegate {

                //	return true;
                //};

                //using (HttpClient client = new HttpClient(handler))
                using (HttpClient client = new HttpClient())
                {
                    HttpContent content = null;
                    if (context.Body != null && context.Body.Length > 0)
                    {
                        content =
                            new ByteArrayContent(context.Body);

                        content.Headers.ContentType =
                            new MediaTypeHeaderValue(GetConteType(context));
                    }

                    HttpRequestMessage msg = new HttpRequestMessage()
                    {
                        Content = content
                    };

                    msg.Headers.Add("User-Agent", ESBContants.HEADER_USER_AGENTE);
                    msg.Headers.Add("X-Forwarded-For", context.IP);
                    msg.Headers.Add("Accept", GetAccept(context));
                    msg.Method     = new HttpMethod(context.Method);
                    msg.RequestUri = CreateUri(context);
                    var resp = await client.SendAsync(msg);

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

                    var headers = resp.Headers.GetEnumerator();
                    while (headers.MoveNext())
                    {
                        headersMap.Add(headers.Current.Key,
                                       string.Join(",", headers.Current.Value));
                    }

                    string contentType = resp.Content != null &&
                                         resp.Content.Headers != null
                                             ? resp.Content.Headers.ContentType.ToString() : null;

                    byte[] bytes;

                    using (var strem = await resp.Content.ReadAsStreamAsync())
                    {
                        bytes = new byte[strem.Length];

                        await strem.ReadAsync(bytes, 0, bytes.Length);
                    }

                    if (!string.IsNullOrEmpty(contentType))
                    {
                        headersMap.Add("Content-Type", contentType);
                    }

                    context.ResponseBody    = bytes;
                    context.StatusCode      = (int)resp.StatusCode;
                    context.ResponseHeaders = headersMap;

                    await ESBFactory
                    .Instance
                    .OutboundProcess
                    .Process(context, responseHandle);
                }
                //}
            }
            catch (Exception e)
            {
                var json = ESBUtil.ParseJson(new
                {
                    Message = "Não foi possível enviar a solicitação para a origem",
                    Url     = context.Url,
                    Detail  = e.Message,
                    Trace   = e.StackTrace
                });

                await responseHandle.Write(ESBUtil.CreateBytes(json), 501);
            }
        }