wabbajack/Wabbajack.WebAutomation/Extensions.cs

88 lines
2.7 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using Wabbajack.Common;
using Cookie = System.Net.Cookie;
namespace Wabbajack.WebAutomation
{
public static class Extensions
{
public static HttpClient ConvertToHTTPClient(this IWebDriver driver)
{
var user_agent = ((IJavaScriptExecutor) driver).ExecuteScript("return navigator.userAgent");
var cookies = driver.Manage().Cookies;
var container = new CookieContainer();
foreach (var cookie in cookies.AllCookies)
{
var uri = new UriBuilder(new Uri(driver.Url));
container.Add(uri.Uri, new Cookie(cookie.Name, cookie.Value));
}
var handler = new HttpClientHandler() {CookieContainer = container};
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("User-Agent", (string)user_agent);
return client;
}
public static bool DownloadUrl(this HttpClient client, string url, string dest, bool download=true)
{
long total_read = 0;
var buffer_size = 1024 * 32;
var response = client.GetSync(url);
var stream = response.Content.ReadAsStreamAsync();
try
{
stream.Wait();
}
catch (Exception ex)
{
}
if (stream.IsFaulted)
{
Utils.Log($"While downloading {url} - {stream.Exception.ExceptionToString()}");
return false;
}
if (!download)
return true;
var header_var = "1";
if (response.Content.Headers.Contains("Content-Length"))
header_var = response.Content.Headers.GetValues("Content-Length").FirstOrDefault();
var content_size = header_var != null ? long.Parse(header_var) : 1;
var filename = Path.GetFileName(dest);
using (var webs = stream.Result)
using (var fs = File.OpenWrite(dest))
{
var buffer = new byte[buffer_size];
while (true)
{
var read = webs.Read(buffer, 0, buffer_size);
if (read == 0) break;
Utils.Status( $"Downloading {filename}", (int)(total_read * 100 / content_size));
fs.Write(buffer, 0, read);
total_read += read;
}
}
return true;
}
}
}