mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
43 lines
1.4 KiB
C#
43 lines
1.4 KiB
C#
|
using System;
|
||
|
using System.Buffers;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Net.Http;
|
||
|
using System.Threading;
|
||
|
using System.Threading.Tasks;
|
||
|
using Wabbajack.RateLimiter;
|
||
|
|
||
|
namespace Wabbajack.Networking.Http
|
||
|
{
|
||
|
public static class HttpClientExtensions
|
||
|
{
|
||
|
public static IEnumerable<(string Key, string Value)> GetSetCookies(this HttpResponseMessage response)
|
||
|
{
|
||
|
if (!response.Headers.TryGetValues("set-cookie", out var values))
|
||
|
return Array.Empty<(string, string)>();
|
||
|
|
||
|
return values
|
||
|
.SelectMany(h => h.Split(";"))
|
||
|
.Select(h => h.Split("="))
|
||
|
.Where(h => h.Length == 2)
|
||
|
.Select(h => (h[0], h[1]));
|
||
|
}
|
||
|
|
||
|
public static async Task<IMemoryOwner<byte>> ReadAsByteArrayAsync(this HttpContent content, IJob job, CancellationToken token)
|
||
|
{
|
||
|
await using var stream = await content.ReadAsStreamAsync(token);
|
||
|
var memory = MemoryPool<byte>.Shared.Rent((int)(job.Size));
|
||
|
|
||
|
while (job.Current < job.Size)
|
||
|
{
|
||
|
var read = await stream.ReadAsync(memory.Memory[(int)job.Current..(int)job.Size], token);
|
||
|
await job.Report(read, token);
|
||
|
}
|
||
|
|
||
|
if (job.Current != job.Size)
|
||
|
throw new Exception("Overread error");
|
||
|
|
||
|
return memory;
|
||
|
}
|
||
|
}
|
||
|
}
|