using System.Linq; using System; using System.Diagnostics; using System.IO; using System.Net; using System.Text; using NLog; namespace NzbDrone.Common { public class HttpProvider { private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public virtual string DownloadString(string address) { return DownloadString(address, null); } public virtual string DownloadString(string address, string username, string password) { return DownloadString(address, new NetworkCredential(username, password)); } public virtual string DownloadString(string address, ICredentials identity) { try { var client = new WebClient { Credentials = identity }; return client.DownloadString(address); } catch (Exception ex) { logger.TraceException(ex.Message, ex); throw; } } public virtual Stream DownloadStream(string url, NetworkCredential credential) { var request = WebRequest.Create(url); request.Credentials = credential; var response = request.GetResponse(); return response.GetResponseStream(); } public virtual void DownloadFile(string url, string fileName) { try { var fileInfo = new FileInfo(fileName); if (!fileInfo.Directory.Exists) { fileInfo.Directory.Create(); } logger.Trace("Downloading [{0}] to [{1}]", url, fileName); var stopWatch = Stopwatch.StartNew(); var webClient = new WebClient(); webClient.DownloadFile(url, fileName); stopWatch.Stop(); logger.Trace("Downloading Completed. took {0:0}s", stopWatch.Elapsed.Seconds); } catch (Exception ex) { logger.Warn("Failed to get response from: {0}", url); logger.TraceException(ex.Message, ex); throw; } } public virtual string PostCommand(string address, string username, string password, string command) { address = String.Format("http://{0}/jsonrpc", address); logger.Trace("Posting command: {0}, to {1}", command, address); byte[] byteArray = Encoding.ASCII.GetBytes(command); var request = (HttpWebRequest)WebRequest.Create(address); request.Method = "POST"; request.Credentials = new NetworkCredential(username, password); request.ContentType = "application/json"; request.Timeout = 20000; request.KeepAlive = false; //Used to hold the JSON response string responseFromServer; using (var requestStream = request.GetRequestStream()) { requestStream.Write(byteArray, 0, byteArray.Length); using (var response = request.GetResponse()) { using (var responseStream = response.GetResponseStream()) { using (var reader = new StreamReader(responseStream)) { responseFromServer = reader.ReadToEnd(); } } } } return responseFromServer.Replace(" ", " "); } } }