aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/Net
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Common/Net')
-rw-r--r--MediaBrowser.Common/Net/HttpRequestOptions.cs157
-rw-r--r--MediaBrowser.Common/Net/HttpResponseInfo.cs75
-rw-r--r--MediaBrowser.Common/Net/IHttpClient.cs59
-rw-r--r--MediaBrowser.Common/Net/INetworkManager.cs66
4 files changed, 357 insertions, 0 deletions
diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs
new file mode 100644
index 000000000..c61e88c87
--- /dev/null
+++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs
@@ -0,0 +1,157 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Threading;
+using System.Text;
+
+namespace MediaBrowser.Common.Net
+{
+ /// <summary>
+ /// Class HttpRequestOptions
+ /// </summary>
+ public class HttpRequestOptions
+ {
+ /// <summary>
+ /// Gets or sets the URL.
+ /// </summary>
+ /// <value>The URL.</value>
+ public string Url { get; set; }
+
+ public CompressionMethod? DecompressionMethod { get; set; }
+
+ /// <summary>
+ /// Gets or sets the accept header.
+ /// </summary>
+ /// <value>The accept header.</value>
+ public string AcceptHeader
+ {
+ get { return GetHeaderValue("Accept"); }
+ set
+ {
+ RequestHeaders["Accept"] = value;
+ }
+ }
+ /// <summary>
+ /// Gets or sets the cancellation token.
+ /// </summary>
+ /// <value>The cancellation token.</value>
+ public CancellationToken CancellationToken { get; set; }
+
+ /// <summary>
+ /// Gets or sets the resource pool.
+ /// </summary>
+ /// <value>The resource pool.</value>
+ public SemaphoreSlim ResourcePool { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user agent.
+ /// </summary>
+ /// <value>The user agent.</value>
+ public string UserAgent
+ {
+ get { return GetHeaderValue("User-Agent"); }
+ set
+ {
+ RequestHeaders["User-Agent"] = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the referrer.
+ /// </summary>
+ /// <value>The referrer.</value>
+ public string Referer { get; set; }
+
+ /// <summary>
+ /// Gets or sets the host.
+ /// </summary>
+ /// <value>The host.</value>
+ public string Host { get; set; }
+
+ /// <summary>
+ /// Gets or sets the progress.
+ /// </summary>
+ /// <value>The progress.</value>
+ public IProgress<double> Progress { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether [enable HTTP compression].
+ /// </summary>
+ /// <value><c>true</c> if [enable HTTP compression]; otherwise, <c>false</c>.</value>
+ public bool EnableHttpCompression { get; set; }
+
+ public Dictionary<string, string> RequestHeaders { get; private set; }
+
+ public string RequestContentType { get; set; }
+
+ public string RequestContent { get; set; }
+ public byte[] RequestContentBytes { get; set; }
+
+ public bool BufferContent { get; set; }
+
+ public bool LogRequest { get; set; }
+ public bool LogRequestAsDebug { get; set; }
+ public bool LogErrors { get; set; }
+ public bool LogResponse { get; set; }
+ public bool LogResponseHeaders { get; set; }
+
+ public bool LogErrorResponseBody { get; set; }
+ public bool EnableKeepAlive { get; set; }
+
+ public CacheMode CacheMode { get; set; }
+ public TimeSpan CacheLength { get; set; }
+
+ public int TimeoutMs { get; set; }
+ public bool EnableDefaultUserAgent { get; set; }
+
+ public bool AppendCharsetToMimeType { get; set; }
+ public string DownloadFilePath { get; set; }
+
+ private string GetHeaderValue(string name)
+ {
+ string value;
+
+ RequestHeaders.TryGetValue(name, out value);
+
+ return value;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="HttpRequestOptions"/> class.
+ /// </summary>
+ public HttpRequestOptions()
+ {
+ EnableHttpCompression = true;
+
+ RequestHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+
+ LogRequest = true;
+ LogErrors = true;
+ CacheMode = CacheMode.None;
+
+ TimeoutMs = 20000;
+ }
+
+ public void SetPostData(IDictionary<string,string> values)
+ {
+ var strings = values.Keys.Select(key => string.Format("{0}={1}", key, values[key]));
+ var postContent = string.Join("&", strings.ToArray());
+
+ RequestContent = postContent;
+ RequestContentType = "application/x-www-form-urlencoded";
+ }
+ }
+
+ public enum CacheMode
+ {
+ None = 0,
+ Unconditional = 1
+ }
+
+ public enum CompressionMethod
+ {
+ Deflate,
+ Gzip
+ }
+}
diff --git a/MediaBrowser.Common/Net/HttpResponseInfo.cs b/MediaBrowser.Common/Net/HttpResponseInfo.cs
new file mode 100644
index 000000000..ed941a447
--- /dev/null
+++ b/MediaBrowser.Common/Net/HttpResponseInfo.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+
+namespace MediaBrowser.Common.Net
+{
+ /// <summary>
+ /// Class HttpResponseInfo
+ /// </summary>
+ public class HttpResponseInfo : IDisposable
+ {
+ /// <summary>
+ /// Gets or sets the type of the content.
+ /// </summary>
+ /// <value>The type of the content.</value>
+ public string ContentType { get; set; }
+
+ /// <summary>
+ /// Gets or sets the response URL.
+ /// </summary>
+ /// <value>The response URL.</value>
+ public string ResponseUrl { get; set; }
+
+ /// <summary>
+ /// Gets or sets the content.
+ /// </summary>
+ /// <value>The content.</value>
+ public Stream Content { get; set; }
+
+ /// <summary>
+ /// Gets or sets the status code.
+ /// </summary>
+ /// <value>The status code.</value>
+ public HttpStatusCode StatusCode { get; set; }
+
+ /// <summary>
+ /// Gets or sets the temp file path.
+ /// </summary>
+ /// <value>The temp file path.</value>
+ public string TempFilePath { get; set; }
+
+ /// <summary>
+ /// Gets or sets the length of the content.
+ /// </summary>
+ /// <value>The length of the content.</value>
+ public long? ContentLength { get; set; }
+
+ /// <summary>
+ /// Gets or sets the headers.
+ /// </summary>
+ /// <value>The headers.</value>
+ public Dictionary<string,string> Headers { get; set; }
+
+ private readonly IDisposable _disposable;
+
+ public HttpResponseInfo(IDisposable disposable)
+ {
+ _disposable = disposable;
+ Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ }
+ public HttpResponseInfo()
+ {
+ Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ }
+
+ public void Dispose()
+ {
+ if (_disposable != null)
+ {
+ _disposable.Dispose();
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Common/Net/IHttpClient.cs b/MediaBrowser.Common/Net/IHttpClient.cs
new file mode 100644
index 000000000..cf5511965
--- /dev/null
+++ b/MediaBrowser.Common/Net/IHttpClient.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Common.Net
+{
+ /// <summary>
+ /// Interface IHttpClient
+ /// </summary>
+ public interface IHttpClient
+ {
+ /// <summary>
+ /// Gets the response.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task{HttpResponseInfo}.</returns>
+ Task<HttpResponseInfo> GetResponse(HttpRequestOptions options);
+
+ /// <summary>
+ /// Gets the specified options.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task{Stream}.</returns>
+ Task<Stream> Get(HttpRequestOptions options);
+
+ /// <summary>
+ /// Sends the asynchronous.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <param name="httpMethod">The HTTP method.</param>
+ /// <returns>Task{HttpResponseInfo}.</returns>
+ Task<HttpResponseInfo> SendAsync(HttpRequestOptions options, string httpMethod);
+
+ /// <summary>
+ /// Posts the specified options.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task{HttpResponseInfo}.</returns>
+ Task<HttpResponseInfo> Post(HttpRequestOptions options);
+
+ /// <summary>
+ /// Downloads the contents of a given url into a temporary location
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task{System.String}.</returns>
+ /// <exception cref="System.ArgumentNullException">progress</exception>
+ /// <exception cref="MediaBrowser.Model.Net.HttpException"></exception>
+ Task<string> GetTempFile(HttpRequestOptions options);
+
+ /// <summary>
+ /// Gets the temporary file response.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task{HttpResponseInfo}.</returns>
+ Task<HttpResponseInfo> GetTempFileResponse(HttpRequestOptions options);
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Common/Net/INetworkManager.cs b/MediaBrowser.Common/Net/INetworkManager.cs
new file mode 100644
index 000000000..b2ff797bc
--- /dev/null
+++ b/MediaBrowser.Common/Net/INetworkManager.cs
@@ -0,0 +1,66 @@
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Net;
+using System.Collections.Generic;
+using System;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Common.Net
+{
+ public interface INetworkManager
+ {
+ event EventHandler NetworkChanged;
+
+ /// <summary>
+ /// Gets a random port number that is currently available
+ /// </summary>
+ /// <returns>System.Int32.</returns>
+ int GetRandomUnusedTcpPort();
+
+ int GetRandomUnusedUdpPort();
+
+ Func<string[]> LocalSubnetsFn { get; set; }
+
+ /// <summary>
+ /// Returns MAC Address from first Network Card in Computer
+ /// </summary>
+ /// <returns>[string] MAC Address</returns>
+ List<string> GetMacAddresses();
+
+ /// <summary>
+ /// Determines whether [is in private address space] [the specified endpoint].
+ /// </summary>
+ /// <param name="endpoint">The endpoint.</param>
+ /// <returns><c>true</c> if [is in private address space] [the specified endpoint]; otherwise, <c>false</c>.</returns>
+ bool IsInPrivateAddressSpace(string endpoint);
+
+ /// <summary>
+ /// Gets the network shares.
+ /// </summary>
+ /// <param name="path">The path.</param>
+ /// <returns>IEnumerable{NetworkShare}.</returns>
+ IEnumerable<NetworkShare> GetNetworkShares(string path);
+
+ /// <summary>
+ /// Gets available devices within the domain
+ /// </summary>
+ /// <returns>PC's in the Domain</returns>
+ IEnumerable<FileSystemEntryInfo> GetNetworkDevices();
+
+ /// <summary>
+ /// Determines whether [is in local network] [the specified endpoint].
+ /// </summary>
+ /// <param name="endpoint">The endpoint.</param>
+ /// <returns><c>true</c> if [is in local network] [the specified endpoint]; otherwise, <c>false</c>.</returns>
+ bool IsInLocalNetwork(string endpoint);
+
+ IpAddressInfo[] GetLocalIpAddresses();
+
+ IpAddressInfo ParseIpAddress(string ipAddress);
+
+ bool TryParseIpAddress(string ipAddress, out IpAddressInfo ipAddressInfo);
+
+ Task<IpAddressInfo[]> GetHostAddressesAsync(string host);
+
+ bool IsAddressInSubnets(string addressString, string[] subnets);
+ }
+} \ No newline at end of file