private void DecorateRequestHeaders(WebClient client, ResourceAccessLevel resourceAccessLevel)
 {
     //attach encrypted user name for protected and private resources
     if (resourceAccessLevel.In(ResourceAccessLevel.PROTECTED, ResourceAccessLevel.PRIVATE))
     {
         string userHeaderName = resourceAccessLevel.GetStringValue();
         if (userHeaderName != null)
         {
             client.Headers.Add(userHeaderName, _credentials.UsernameOrClientID.GetMD5Hash());
         }
     }
     if (_cookies.Any())
     {
         client.Headers.Add(HttpRequestHeader.Cookie, _rawCookies);
     }
 }
        public async Task <Response> HttpGet(string url, WebHeaderCollection headers = null, ResourceAccessLevel resourceAccessLevel = ResourceAccessLevel.PUBLIC, string query = "", bool logRequestUrl = true, bool logError = true)
        {
            Response res = null;

            using (var client = new WebClient {
                Headers = headers
            })
            {
                try
                {
                    if (!query.IsNullOrWhiteSpace())
                    {
                        url += $"?{query}";
                    }

                    if (logRequestUrl)
                    {
                        await _logger.LogDebug($"GET {url}");
                    }

                    DecorateRequestHeaders(client, resourceAccessLevel);
                    string data = await client.DownloadStringTaskAsync(url);

                    await _logger.LogDebug($"{data}");

                    //PrintHeaders(client);

                    res = new Response(data, client.ResponseHeaders, HttpStatusCode.OK);
                    UpdateCookies(client);
                }
                catch (ThreadInterruptedException)
                {
                    throw;
                }
                catch (WebException we)
                {
                    if (logError || _logger.IsDebug)
                    {
                        await _logger.LogError(we.Message);
                    }
                    //PrintHeaders(client);
                    if (we.Response is HttpWebResponse resp)
                    {
                        return(new Response(we.Message, resp.StatusCode));
                    }
                    else
                    {
                        return(new Response(we.Message));
                    }
                }
                catch (Exception e)
                {
                    await _logger.LogError(e.Message);

                    //PrintHeaders(client);
                    res = new Response(e.Message);
                }
            }
            return(res);
        }
 public async Task <Response> HttpPut(string url, WebHeaderCollection headers = null, string body = null, ResourceAccessLevel resourceAccessLevel = ResourceAccessLevel.PUBLIC)
 {
     // NOT implemented
     return(await Task.FromResult(new Response()));
 }
        public async Task <Response> HttpPost(string url, WebHeaderCollection headers = null, string body = null, ResourceAccessLevel resourceAccessLevel = ResourceAccessLevel.PUBLIC, bool logRequestUrl = true)
        {
            Response res;

            using var client = new WebClient { Headers = headers };
            try
            {
                if (logRequestUrl)
                {
                    await _logger.LogDebug($"POST {url}");
                }
                DecorateRequestHeaders(client, resourceAccessLevel);
                string data = await client.UploadStringTaskAsync(url, body);

                //PrintHeaders(client);

                res = new Response(data, client.ResponseHeaders, HttpStatusCode.OK);
                UpdateCookies(client);
            }
            catch (ThreadInterruptedException)
            {
                throw;
            }
            catch (WebException we)
            {
                await _logger.LogError(we.Message);

                //PrintHeaders(client);
                if (we.Response is HttpWebResponse resp)
                {
                    return(new Response(we.Message, resp.StatusCode));
                }
                else
                {
                    return(new Response(we.Message));
                }
            }
            catch (Exception e)
            {
                await _logger.LogError(e.Message);

                //PrintHeaders(client);
                res = new Response(e.Message);
            }
            return(res);
        }