using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using SpotifyAPI.Web.Models; namespace SpotifyAPI.Web { internal class SpotifyWebClient : IClient { public JsonSerializerSettings JsonSettings { get; set; } private readonly WebClient _webClient; private readonly Encoding _encoding = Encoding.UTF8; public SpotifyWebClient() { _webClient = new WebClient() { Proxy = null, Encoding = _encoding }; } public void Dispose() { _webClient.Dispose(); } public Tuple Download(string url) { Tuple response; try { Tuple raw = DownloadRaw(url); response = new Tuple(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}"); } catch (WebException e) { using (StreamReader reader = new StreamReader(e.Response.GetResponseStream())) { response = new Tuple(new ResponseInfo { Headers = _webClient.ResponseHeaders }, reader.ReadToEnd()); } } return response; } public async Task> DownloadAsync(string url) { Tuple response; try { Tuple raw = await DownloadRawAsync(url); response = new Tuple(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}"); } catch (WebException e) { using (StreamReader reader = new StreamReader(e.Response.GetResponseStream())) { response = new Tuple(new ResponseInfo { Headers = _webClient.ResponseHeaders }, reader.ReadToEnd()); } } return response; } public Tuple DownloadRaw(string url) { byte[] data = _webClient.DownloadData(url); ResponseInfo info = new ResponseInfo() { Headers = _webClient.ResponseHeaders }; return new Tuple(info, data); } public async Task> DownloadRawAsync(string url) { using (WebClient webClient = new WebClient()) { webClient.Proxy = null; webClient.Encoding = _encoding; webClient.Headers = _webClient.Headers; byte[] data = await _webClient.DownloadDataTaskAsync(url); ResponseInfo info = new ResponseInfo() { Headers = webClient.ResponseHeaders }; return new Tuple(info, data); } } public Tuple DownloadJson(string url) { Tuple response = Download(url); return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); } public async Task> DownloadJsonAsync(string url) { Tuple response = await DownloadAsync(url); return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); } public Tuple Upload(string url, string body, string method) { Tuple response; try { Tuple data = UploadRaw(url, body, method); response = new Tuple(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}"); } catch (WebException e) { using (StreamReader reader = new StreamReader(e.Response.GetResponseStream())) { response = new Tuple(new ResponseInfo { Headers = _webClient.ResponseHeaders }, reader.ReadToEnd()); } } return response; } public async Task> UploadAsync(string url, string body, string method) { Tuple response; try { Tuple data = await UploadRawAsync(url, body, method); response = new Tuple(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}"); } catch (WebException e) { using (StreamReader reader = new StreamReader(e.Response.GetResponseStream())) { response = new Tuple(new ResponseInfo { Headers = _webClient.ResponseHeaders }, reader.ReadToEnd()); } } return response; } public Tuple UploadRaw(string url, string body, string method) { byte[] data = _webClient.UploadData(url, method, _encoding.GetBytes(body)); ResponseInfo info = new ResponseInfo { Headers = _webClient.ResponseHeaders }; return new Tuple(info, data); } public async Task> UploadRawAsync(string url, string body, string method) { using (WebClient webClient = new WebClient()) { webClient.Proxy = null; webClient.Encoding = _encoding; webClient.Headers = _webClient.Headers; byte[] data = await _webClient.UploadDataTaskAsync(url, method, _encoding.GetBytes(body)); ResponseInfo info = new ResponseInfo { Headers = _webClient.ResponseHeaders }; return new Tuple(info, data); } } public Tuple UploadJson(string url, string body, string method) { Tuple response = Upload(url, body, method); return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); } public async Task> UploadJsonAsync(string url, string body, string method) { Tuple response = await UploadAsync(url, body, method); return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); } public void SetHeader(string header, string value) { _webClient.Headers[header] = value; } public void RemoveHeader(string header) { if (_webClient.Headers[header] != null) _webClient.Headers.Remove(header); } public List> GetHeaders() { return _webClient.Headers.AllKeys.Select(header => new KeyValuePair(header, _webClient.Headers[header])).ToList(); } } }