Пример #1
0
        /// <summary>
        /// Download the attachment at the url and store it locally at the given location
        /// </summary>
        public async Task DownloadAttachmentAsync(string relativeUrl, string destinationPath)
        {
            var additionalRequestConfiguration = new RequestConfiguration();

            additionalRequestConfiguration.AttachmentDownloadPath = destinationPath;

            await SendAsync(relativeUrl, null, RequestType.GetOctet, null, true, additionalRequestConfiguration);
        }
Пример #2
0
        public async Task <ResponseWrapper> SendAsync(string restRelativeUri, string queryParams, RequestType requestType, string data, bool allowReconnect = true, RequestConfiguration additionalRequestConfiguration = null)
        {
            if (!IsConnected())
            {
                throw new NotConnectedException();
            }

            restRelativeUri = string.IsNullOrWhiteSpace(queryParams) ? restRelativeUri : restRelativeUri + (restRelativeUri.Contains("?") ? "&" : "?") + queryParams;
            HttpWebRequest request = CreateRequest(restRelativeUri, requestType, additionalRequestConfiguration);

            if ((requestType == RequestType.Post || requestType == RequestType.Update) && !string.IsNullOrEmpty(data))
            {
                byte[] byteData = Encoding.UTF8.GetBytes(data);
                bool   gzip     = additionalRequestConfiguration != null && additionalRequestConfiguration.GZipCompression;
                if (gzip)
                {
                    using (Stream postStream = await request.GetRequestStreamAsync().ConfigureAwait(AwaitContinueOnCapturedContext))
                    {
                        using (var zipStream = new GZipStream(postStream, CompressionMode.Compress))
                        {
                            zipStream.Write(byteData, 0, byteData.Length);
                        }
                    }
                }
                else
                {
                    request.ContentLength = byteData.Length;
                    using (Stream postStream = await request.GetRequestStreamAsync().ConfigureAwait(AwaitContinueOnCapturedContext))
                    {
                        postStream.Write(byteData, 0, byteData.Length);
                    }
                }
            }

            InvalidCredentialException originalException = null;

            try
            {
                if (requestType == RequestType.GetOctet && additionalRequestConfiguration != null)
                {
                    return(await DownloadAttachmentInternalAsync(request, additionalRequestConfiguration.AttachmentDownloadPath).ConfigureAwait(AwaitContinueOnCapturedContext));
                }
                else
                {
                    return(await DoSendAsync(request).ConfigureAwait(AwaitContinueOnCapturedContext));
                }
            }
            //catch - intended to handle the case LWSSO is expired, we will try reconnect and resend original request
            catch (InvalidCredentialException e)
            {
                // await can't exist in a catch because the CLR would lose the ambient exception.
                // We don’t need the ambient exception (i.e. we don't "throw;",
                // so we need to trick it out by putting retry logic after the catch
                originalException = e;
            }

            //RECONNECT SECTION
            try
            {
                bool reconnected = allowReconnect && await Reconnect();

                if (!reconnected)
                {
                    throw originalException;
                }
                // we reconnected,
                // but await can't exist in a catch because the CLR would lose the ambient exception.
                // We don’t need the ambient exception (i.e. we don't "throw;",
                // so we need to trick it out by putting retry logic after the catch
            }
            catch
            {
                //if reconnect throwed any exception - we rethrow original exception
                throw originalException;
            }

            //resend after reconnect
            return(await SendAsync(restRelativeUri, queryParams, requestType, data, false, additionalRequestConfiguration)
                   .ConfigureAwait(AwaitContinueOnCapturedContext));
        }
Пример #3
0
 public Task <ResponseWrapper> ExecuteDeleteAsync(string restRelativeUri, RequestConfiguration additionalRequestConfiguration = null)
 {
     return(SendAsync(restRelativeUri, null, RequestType.Delete, null, true, additionalRequestConfiguration));
 }
Пример #4
0
 public ResponseWrapper Send(string restRelativeUri, string queryParams, RequestType requestType, string data, RequestConfiguration additionalData = null)
 {
     return(SendAsync(restRelativeUri, queryParams, requestType, data, true, additionalData).Result);
 }
Пример #5
0
 public ResponseWrapper ExecuteDelete(string restRelativeUri, RequestConfiguration additionalRequestConfiguration = null)
 {
     return(ExecuteDeleteAsync(restRelativeUri, additionalRequestConfiguration).Result);
 }
Пример #6
0
 public Task <ResponseWrapper> ExecutePutAsync(string restRelativeUri, string queryParams, string data, RequestConfiguration additionalRequestConfiguration = null)
 {
     return(SendAsync(restRelativeUri, queryParams, RequestType.Update, data, true, additionalRequestConfiguration));
 }
Пример #7
0
 public ResponseWrapper ExecutePut(string restRelativeUri, string queryParams, string data, RequestConfiguration additionalRequestConfiguration = null)
 {
     return(ExecutePutAsync(restRelativeUri, queryParams, data, additionalRequestConfiguration).Result);
 }
Пример #8
0
        private HttpWebRequest CreateRequest(string restRelativeUri, RequestType requestType, RequestConfiguration additionalRequestConfiguration)
        {
            string         url     = Host + restRelativeUri;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            if (NetworkSettings.CustomProxy != null)
            {
                request.Proxy = NetworkSettings.CustomProxy;
            }

            //Add authentication cookies/headers
            authenticationStrategy.PrepareRequest(request);


            //add internal API token
            request.Headers.Add("HPECLIENTTYPE", "HPE_CI_CLIENT");


            //set content type/accept/method
            switch (requestType)
            {
            case RequestType.Get:
                request.Accept = CONTENT_TYPE_JSON;
                request.Method = METHOD_GET;
                break;

            case RequestType.GetOctet:
                request.Accept = CONTENT_TYPE_STREAM;
                request.Method = METHOD_GET;
                break;

            case RequestType.Post:
                request.ContentType = CONTENT_TYPE_JSON;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_POST;
                break;

            case RequestType.PostOctet:
                request.ContentType = CONTENT_TYPE_STREAM;
                request.Method      = METHOD_POST;
                break;

            case RequestType.Delete:
                request.Accept = CONTENT_TYPE_JSON;
                request.Method = METHOD_DELETE;
                break;

            case RequestType.Update:
                request.ContentType = CONTENT_TYPE_JSON;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_PUT;
                break;

            case RequestType.MultiPart:
                request.ContentType = CONTENT_TYPE_MULTIPART;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_POST;
                break;

            default:
                break;
            }

            if (additionalRequestConfiguration != null)
            {
                if (additionalRequestConfiguration.Timeout.HasValue)
                {
                    request.Timeout = additionalRequestConfiguration.Timeout.Value;
                }
                if (additionalRequestConfiguration.Headers != null)
                {
                    foreach (KeyValuePair <string, string> header2value in additionalRequestConfiguration.Headers)
                    {
                        switch (header2value.Key.ToLower())
                        {
                        case "contenttype":
                            request.ContentType = header2value.Value;
                            break;

                        case "accept":
                            request.Accept = header2value.Value;
                            break;

                        default:
                            request.Headers.Add(header2value.Key, header2value.Value);
                            break;
                        }
                    }
                }
                if (additionalRequestConfiguration.GZipCompression)
                {
                    request.Headers.Add("Content-Encoding", "gzip");
                }
            }

            return(request);
        }
        private HttpWebRequest CreateRequest(string restRelativeUri, RequestType requestType, RequestConfiguration additionalRequestConfiguration)
        {
            String         url     = host + restRelativeUri;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            //add cookies
            String cookieDomain = request.Address.Host;
            String cookiePath   = "/";

            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(new Cookie(LWSSO_COOKIE_NAME, lwSsoCookie, cookiePath, cookieDomain));
            request.CookieContainer.Add(new Cookie(OCTANE_USER_COOKIE_NAME, octaneUserCookie, cookiePath, cookieDomain));

            //add internal API token
            request.Headers.Add("HPECLIENTTYPE", "HPE_CI_CLIENT");
            //request.Headers.Add("ALM_OCTANE_TECH_PREVIEW", "true");


            //set content type/accept/method
            switch (requestType)
            {
            case RequestType.Get:
                request.Accept = CONTENT_TYPE_JSON;
                request.Method = METHOD_GET;
                break;

            case RequestType.GetOctet:
                request.Accept = CONTENT_TYPE_STREAM;
                request.Method = METHOD_GET;
                break;

            case RequestType.Post:
                request.ContentType = CONTENT_TYPE_JSON;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_POST;
                break;

            case RequestType.PostOctet:
                request.ContentType = CONTENT_TYPE_STREAM;
                request.Method      = METHOD_POST;
                break;

            case RequestType.Delete:
                request.Accept = CONTENT_TYPE_JSON;
                request.Method = METHOD_DELETE;
                break;

            case RequestType.Update:
                request.ContentType = CONTENT_TYPE_JSON;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_PUT;
                break;

            case RequestType.MultiPart:
                request.ContentType = CONTENT_TYPE_MULTIPART;
                request.Accept      = CONTENT_TYPE_JSON;
                request.Method      = METHOD_POST;
                break;

            default:
                break;
            }

            if (additionalRequestConfiguration != null)
            {
                if (additionalRequestConfiguration.Timeout.HasValue)
                {
                    request.Timeout = additionalRequestConfiguration.Timeout.Value;
                }
                if (additionalRequestConfiguration.Headers != null)
                {
                    foreach (KeyValuePair <string, string> header2value in additionalRequestConfiguration.Headers)
                    {
                        switch (header2value.Key.ToLower())
                        {
                        case "contenttype":
                            request.ContentType = header2value.Value;
                            break;

                        case "accept":
                            request.Accept = header2value.Value;
                            break;

                        default:
                            request.Headers.Add(header2value.Key, header2value.Value);
                            break;
                        }
                    }
                }
                if (additionalRequestConfiguration.GZipCompression)
                {
                    request.Headers.Add("Content-Encoding", "gzip");
                }
            }

            return(request);
        }