private static IPromise <IHttpResponse> SendSync(SyncHttpClient service, HttpRequest req, LogData trace)
        {
            try
            {
                return(Promises.Resolved((IHttpResponse)service.Send(req)));
            }
            catch (System.Net.WebException webex)
            {
                switch (webex.Status)
                {
                case System.Net.WebExceptionStatus.RequestCanceled:
                case System.Net.WebExceptionStatus.Timeout:
                    return(Promises.Rejected <IHttpResponse>(new HttpTimeoutException(string.Format("A response was not received after waiting for {0:m' minutes, 's' seconds'}", req.Timeout))));

                default:
                    foreach (var kvp in trace)
                    {
                        webex.Data[kvp.Key] = kvp.Value;
                    }
                    trace.Add("exception", webex);
                    return(Promises.Rejected <IHttpResponse>(webex));
                }
            }
            catch (Exception ex)
            {
                foreach (var kvp in trace)
                {
                    ex.Data[kvp.Key] = kvp.Value;
                }
                trace.Add("exception", ex);
                return(Promises.Rejected <IHttpResponse>(ex));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Uploads the files and applies the AML in a single transaction
        /// </summary>
        /// <param name="async">Whether to perform this action asynchronously</param>
        /// <returns>A promise to return an XML SOAP response as a <see cref="System.IO.Stream"/></returns>
        internal IPromise <Stream> UploadAndApply(string soapAction, string aml, IEnumerable <CommandFile> files, bool async)
        {
            return(Vault.TransformUrl(_conn, async).Continue(u =>
            {
                // Compile the headers and AML query into the appropriate content
                var content = new FormContent();
                _conn.SetDefaultHeaders(content.Add);
                content.Add("SOAPACTION", soapAction);
                content.Add("VAULTID", Vault.Id);
                content.Add("XMLdata", "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:i18n=\"http://www.aras.com/I18N\"><SOAP-ENV:Body><ApplyItem>" +
                            aml +
                            "</ApplyItem></SOAP-ENV:Body></SOAP-ENV:Envelope>");
                foreach (var file in files)
                {
                    content.Add(file.AsContent(this, _conn.AmlContext.LocalizationContext, true).Single());
                }
                content.Compression = _conn.Compression;

                var req = new HttpRequest()
                {
                    Content = content
                };
                foreach (var ac in _conn.DefaultSettings)
                {
                    ac.Invoke(req);
                }
                Settings?.Invoke(req);

                req.Headers.TransferEncodingChunked = true;

                var trace = new LogData(4
                                        , "Innovator: Execute query"
                                        , LogListener ?? Factory.LogListener
                                        , Parameters)
                {
                    { "aras_url", _conn.MapClientUrl("../../Server") },
                    { "database", _conn.Database },
                    { "query", aml },
                    { "soap_action", soapAction },
                    { "url", Vault.Url },
                    { "user_id", _conn.UserId },
                    { "vault_id", Vault.Id },
                    { "version", _conn.Version }
                };
                _conn.SetDefaultHeaders((name, value) =>
                {
                    if (string.Equals(name, "LOCALE", StringComparison.OrdinalIgnoreCase) ||
                        string.Equals(name, "TIMEZONE_NAME", StringComparison.OrdinalIgnoreCase))
                    {
                        trace.Add(name.ToLowerInvariant(), value);
                    }
                });
                return Vault.HttpClient
                .PostPromise(new Uri(Vault.Url), async, req, trace)
                .Always(trace.Dispose)
                .Always(req.Dispose);
            }).Convert(r => r.AsStream));
        }
        private static IPromise <T> ToHttpPromise <T>(this Task <T> task, TimeoutSource timeout, LogData trace)
        {
            var result = new Promise <T>();

            result.CancelTarget(timeout);
            task
            .ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    Exception ex = t.Exception;
                    while (ex != null && ex.InnerException != null && ex.GetType().Name == "AggregateException")
                    {
                        ex = ex.InnerException;
                    }

                    if (ex != null)
                    {
                        foreach (var kvp in trace)
                        {
                            ex.Data[kvp.Key] = kvp.Value;
                        }
                        trace.Add("exception", ex);
                    }
                    result.Reject(ex);
                }
                else if (t.IsCanceled)
                {
                    result.Reject(new HttpTimeoutException(string.Format("A response was not received after waiting for {0:m' minutes, 's' seconds'}", TimeSpan.FromMilliseconds(timeout.TimeoutDelay))));
                }
                else
                {
                    result.Resolve(t.Result);
                }
            });
            return(result);
        }