Spotify.NET/SpotifyAPI/Web/SpotifyWebClient.cs

212 lines
9.4 KiB
C#
Raw Normal View History

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
2017-05-31 16:25:56 +01:00
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
2015-11-05 20:20:22 +00:00
using System.Threading.Tasks;
2016-07-07 20:23:36 +01:00
using SpotifyAPI.Web.Models;
namespace SpotifyAPI.Web
{
internal class SpotifyWebClient : IClient
{
public JsonSerializerSettings JsonSettings { get; set; }
public ProxyConfig ProxyConfig { get; set; }
private readonly Encoding _encoding = Encoding.UTF8;
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, string> Download(string url, Dictionary<string, string> headers = null)
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, byte[]> raw = DownloadRaw(url, headers);
return new Tuple<ResponseInfo, string>(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}");
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, string>> DownloadAsync(string url, Dictionary<string, string> headers = null)
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, byte[]> raw = await DownloadRawAsync(url, headers).ConfigureAwait(false);
return new Tuple<ResponseInfo, string>(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}");
}
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, byte[]> DownloadRaw(string url, Dictionary<string, string> headers = null)
{
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
using (HttpClient client = new HttpClient(clientHandler))
{
2017-05-31 16:25:56 +01:00
if (headers != null)
{
foreach (KeyValuePair<string, string> headerPair in headers)
{
2017-05-31 18:54:13 +01:00
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
2017-05-31 16:25:56 +01:00
}
}
using (HttpResponseMessage response = Task.Run(() => client.GetAsync(url)).Result)
{
2017-05-31 17:17:07 +01:00
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
2016-07-07 20:23:36 +01:00
{
2017-05-31 17:17:07 +01:00
StatusCode = response.StatusCode,
2017-05-31 16:25:56 +01:00
Headers = ConvertHeaders(response.Headers)
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
}
}
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, byte[]>> DownloadRawAsync(string url, Dictionary<string, string> headers = null)
2015-11-05 20:20:22 +00:00
{
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
using (HttpClient client = new HttpClient(clientHandler))
2015-11-05 20:20:22 +00:00
{
2017-05-31 16:25:56 +01:00
if (headers != null)
{
foreach (KeyValuePair<string, string> headerPair in headers)
{
2017-05-31 18:54:13 +01:00
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
2017-05-31 16:25:56 +01:00
}
}
using (HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false))
2015-11-05 20:20:22 +00:00
{
2017-05-31 17:17:07 +01:00
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
2016-07-07 20:23:36 +01:00
{
2017-05-31 17:17:07 +01:00
StatusCode = response.StatusCode,
2017-05-31 16:25:56 +01:00
Headers = ConvertHeaders(response.Headers)
}, await response.Content.ReadAsByteArrayAsync());
2015-11-05 20:20:22 +00:00
}
}
}
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, T> DownloadJson<T>(string url, Dictionary<string, string> headers = null)
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, string> response = Download(url, headers);
return new Tuple<ResponseInfo, T>(response.Item1, JsonConvert.DeserializeObject<T>(response.Item2, JsonSettings));
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, T>> DownloadJsonAsync<T>(string url, Dictionary<string, string> headers = null)
2015-11-05 20:20:22 +00:00
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, string> response = await DownloadAsync(url, headers).ConfigureAwait(false);
return new Tuple<ResponseInfo, T>(response.Item1, JsonConvert.DeserializeObject<T>(response.Item2, JsonSettings));
2015-11-05 20:20:22 +00:00
}
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, string> Upload(string url, string body, string method, Dictionary<string, string> headers = null)
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, byte[]> data = UploadRaw(url, body, method, headers);
return new Tuple<ResponseInfo, string>(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}");
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, string>> UploadAsync(string url, string body, string method, Dictionary<string, string> headers = null)
2015-11-05 20:20:22 +00:00
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, byte[]> data = await UploadRawAsync(url, body, method, headers).ConfigureAwait(false);
return new Tuple<ResponseInfo, string>(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}");
2015-11-05 20:20:22 +00:00
}
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, byte[]> UploadRaw(string url, string body, string method, Dictionary<string, string> headers = null)
{
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
using (HttpClient client = new HttpClient(clientHandler))
{
2017-05-31 16:25:56 +01:00
if (headers != null)
{
2017-05-31 16:25:56 +01:00
foreach (KeyValuePair<string, string> headerPair in headers)
2016-07-07 20:23:36 +01:00
{
2017-05-31 18:54:13 +01:00
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
2017-05-31 16:25:56 +01:00
}
}
2017-05-31 16:25:56 +01:00
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
{
Content = new StringContent(body, _encoding)
};
using (HttpResponseMessage response = Task.Run(() => client.SendAsync(message)).Result)
2015-11-05 20:20:22 +00:00
{
2017-05-31 16:25:56 +01:00
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
2016-07-07 20:23:36 +01:00
{
2017-05-31 17:17:07 +01:00
StatusCode = response.StatusCode,
2017-05-31 16:25:56 +01:00
Headers = ConvertHeaders(response.Headers)
}, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result);
2015-11-05 20:20:22 +00:00
}
}
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, byte[]>> UploadRawAsync(string url, string body, string method, Dictionary<string, string> headers = null)
{
HttpClientHandler clientHandler = CreateClientHandler(ProxyConfig);
using (HttpClient client = new HttpClient(clientHandler))
2016-07-07 20:23:36 +01:00
{
2017-05-31 16:25:56 +01:00
if (headers != null)
{
foreach (KeyValuePair<string, string> headerPair in headers)
{
2017-05-31 18:54:13 +01:00
client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value);
2017-05-31 16:25:56 +01:00
}
}
2017-05-31 16:25:56 +01:00
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url)
2016-07-07 20:23:36 +01:00
{
2017-05-31 16:25:56 +01:00
Content = new StringContent(body, _encoding)
2016-07-07 20:23:36 +01:00
};
2017-05-31 16:25:56 +01:00
using (HttpResponseMessage response = await client.SendAsync(message))
{
return new Tuple<ResponseInfo, byte[]>(new ResponseInfo
{
2017-05-31 17:17:07 +01:00
StatusCode = response.StatusCode,
2017-05-31 16:25:56 +01:00
Headers = ConvertHeaders(response.Headers)
}, await response.Content.ReadAsByteArrayAsync());
}
}
2015-11-05 20:20:22 +00:00
}
2017-05-31 16:25:56 +01:00
public Tuple<ResponseInfo, T> UploadJson<T>(string url, string body, string method, Dictionary<string, string> headers = null)
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, string> response = Upload(url, body, method, headers);
2016-07-07 20:23:36 +01:00
return new Tuple<ResponseInfo, T>(response.Item1, JsonConvert.DeserializeObject<T>(response.Item2, JsonSettings));
}
2017-05-31 16:25:56 +01:00
public async Task<Tuple<ResponseInfo, T>> UploadJsonAsync<T>(string url, string body, string method, Dictionary<string, string> headers = null)
2015-11-05 20:20:22 +00:00
{
2017-05-31 16:25:56 +01:00
Tuple<ResponseInfo, string> response = await UploadAsync(url, body, method, headers).ConfigureAwait(false);
2016-07-07 20:23:36 +01:00
return new Tuple<ResponseInfo, T>(response.Item1, JsonConvert.DeserializeObject<T>(response.Item2, JsonSettings));
2015-11-05 20:20:22 +00:00
}
2017-05-31 16:25:56 +01:00
public void Dispose()
{
2017-05-31 16:25:56 +01:00
GC.SuppressFinalize(this);
}
2017-05-31 16:25:56 +01:00
private static WebHeaderCollection ConvertHeaders(HttpResponseHeaders headers)
{
2017-05-31 16:25:56 +01:00
WebHeaderCollection newHeaders = new WebHeaderCollection();
foreach (KeyValuePair<string, IEnumerable<string>> headerPair in headers)
{
foreach (string headerValue in headerPair.Value)
{
newHeaders.Add(headerPair.Key, headerValue);
}
}
return newHeaders;
}
private static HttpClientHandler CreateClientHandler(ProxyConfig proxyConfig = null)
{
HttpClientHandler clientHandler = new HttpClientHandler
{
PreAuthenticate = false,
UseDefaultCredentials = true,
UseProxy = false
};
if (!string.IsNullOrWhiteSpace(proxyConfig?.Host))
{
WebProxy proxy = proxyConfig.CreateWebProxy();
clientHandler.UseProxy = true;
clientHandler.Proxy = proxy;
clientHandler.UseDefaultCredentials = proxy.UseDefaultCredentials;
clientHandler.PreAuthenticate = proxy.UseDefaultCredentials;
}
return clientHandler;
}
}
}