Skip to content

Commit

Permalink
Added new constructors and added support for UAP. (Linked to #1)
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Feb 8, 2017
1 parent 00297f2 commit 215133e
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 29 deletions.
11 changes: 11 additions & 0 deletions src/WebDAV-Client/ApiParams/WebDavClientParams.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;

namespace WebDav
{
Expand All @@ -21,6 +22,16 @@ public WebDavClientParams()
UseProxy = true;
}

/// <summary>
/// Gets or sets the HTTP message handler. Note that this overrides some other properties in this class like:
/// - PreAuthenticate
/// - UseDefaultCredentials
/// - UseProxy
/// - Credentials
/// - Proxy
/// </summary>
public HttpMessageHandler HttpMessageHandler { get; set; }

/// <summary>
/// Gets or sets a value that controls whether default credentials are sent.
/// </summary>
Expand Down
5 changes: 1 addition & 4 deletions src/WebDAV-Client/Infrastructure/WebDavDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,7 @@ public void Dispose()

protected virtual void DisposeManagedResources()
{
if (_httpClient != null)
{
_httpClient.Dispose();
}
_httpClient?.Dispose();
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if NETSTANDARD || PORTABLE
#if NETSTANDARD || PORTABLE || UAP
// Copied from https://github.com/Microsoft/referencesource/blob/4fe4349175f4c5091d972a7e56ea12012f1e7170/System/compmod/system/componentmodel/InvalidEnumArgumentException.cs

namespace System.ComponentModel
Expand Down
94 changes: 73 additions & 21 deletions src/WebDAV-Client/WebDavClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class WebDavClient : IDisposable
/// <summary>
/// Initializes a new instance of the <see cref="WebDavClient"/> class.
/// </summary>
[PublicAPI]
public WebDavClient()
: this(new WebDavClientParams())
{
Expand All @@ -39,9 +40,22 @@ public WebDavClient()
/// Initializes a new instance of the <see cref="WebDavClient"/> class.
/// </summary>
/// <param name="params">The parameters of the WebDAV client.</param>
public WebDavClient(WebDavClientParams @params)
[PublicAPI]
public WebDavClient([NotNull] WebDavClientParams @params) : this(ConfigureHttpClient(@params))
{
SetWebDavDispatcher(new WebDavDispatcher(ConfigureHttpClient(@params)));
Check.NotNull(@params, nameof(@params));
}

/// <summary>
/// Initializes a new instance of the <see cref="WebDavClient"/> class using a HttpClient.
/// </summary>
/// <param name="httpClient">The HTTP client.</param>
[PublicAPI]
public WebDavClient([NotNull] HttpClient httpClient)
{
Check.NotNull(httpClient, nameof(httpClient));

SetWebDavDispatcher(new WebDavDispatcher(httpClient));

var lockResponseParser = new LockResponseParser();
SetPropfindResponseParser(new PropfindResponseParser(lockResponseParser));
Expand Down Expand Up @@ -128,13 +142,17 @@ public async Task<ProppatchResponse> Proppatch([NotNull] Uri requestUri, [NotNul
var headers = new RequestHeaders();
if (!string.IsNullOrEmpty(parameters.LockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.LockToken)));

var requestBody = ProppatchRequestBuilder.BuildRequestBody(
parameters.PropertiesToSet,
parameters.PropertiesToRemove,
parameters.Namespaces);

var requestParams = new RequestParameters { Headers = headers, Content = new StringContent(requestBody) };

var response = await _dispatcher.Send(requestUri, WebDavMethod.Proppatch, requestParams, parameters.CancellationToken);
var responseContent = await ReadContentAsString(response.Content).ConfigureAwait(false);

return _proppatchResponseParser.Parse(responseContent, response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -183,8 +201,11 @@ public async Task<WebDavResponse> Mkcol([NotNull] Uri requestUri, [NotNull] MkCo
var headers = new RequestHeaders();
if (!string.IsNullOrEmpty(parameters.LockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.LockToken)));

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(requestUri, WebDavMethod.Mkcol, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -280,9 +301,13 @@ internal virtual async Task<WebDavStreamResponse> GetFile([NotNull] Uri requestU
{
new KeyValuePair<string, string>("Translate", translate ? "t" : "f")
};

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(requestUri, HttpMethod.Get, requestParams, cancellationToken);

var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

return new WebDavStreamResponse(response.StatusCode, response.Description, stream);
}

Expand Down Expand Up @@ -331,8 +356,11 @@ public async Task<WebDavResponse> Delete([NotNull] Uri requestUri, [NotNull] Del
var headers = new RequestHeaders();
if (!string.IsNullOrEmpty(parameters.LockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.LockToken)));

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(requestUri, HttpMethod.Delete, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -410,8 +438,11 @@ public async Task<WebDavResponse> PutFile([NotNull] Uri requestUri, [NotNull] St
var headers = new RequestHeaders();
if (!string.IsNullOrEmpty(parameters.LockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.LockToken)));

var requestParams = new RequestParameters { Headers = headers, Content = new StreamContent(stream), ContentType = parameters.ContentType };

var response = await _dispatcher.Send(requestUri, HttpMethod.Put, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -469,11 +500,14 @@ public async Task<WebDavResponse> Copy([NotNull] Uri sourceUri, [NotNull] Uri de
new KeyValuePair<string, string>("Depth", DepthHeaderHelper.GetValueForCopy(applyTo)),
new KeyValuePair<string, string>("Overwrite", parameters.Overwrite ? "T" : "F")
};

if (!string.IsNullOrEmpty(parameters.DestLockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.DestLockToken)));

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(sourceUri, WebDavMethod.Copy, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -529,13 +563,17 @@ public async Task<WebDavResponse> Move([NotNull] Uri sourceUri, [NotNull] Uri de
new KeyValuePair<string, string>("Destination", GetAbsoluteUri(destUri).ToString()),
new KeyValuePair<string, string>("Overwrite", parameters.Overwrite ? "T" : "F")
};

if (!string.IsNullOrEmpty(parameters.SourceLockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.SourceLockToken)));

if (!string.IsNullOrEmpty(parameters.DestLockToken))
headers.Add(new KeyValuePair<string, string>("If", IfHeaderHelper.GetHeaderValue(parameters.DestLockToken)));

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(sourceUri, WebDavMethod.Move, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -584,16 +622,21 @@ public async Task<LockResponse> Lock([NotNull] Uri requestUri, [NotNull] LockPar
var headers = new RequestHeaders();
if (parameters.ApplyTo.HasValue)
headers.Add(new KeyValuePair<string, string>("Depth", DepthHeaderHelper.GetValueForLock(parameters.ApplyTo.Value)));

if (parameters.Timeout.HasValue)
headers.Add(new KeyValuePair<string, string>("Timeout", string.Format("Second-{0}", parameters.Timeout.Value.TotalSeconds)));

var requestBody = LockRequestBuilder.BuildRequestBody(parameters);

var requestParams = new RequestParameters { Headers = headers, Content = new StringContent(requestBody) };

var response = await _dispatcher.Send(requestUri, WebDavMethod.Lock, requestParams, parameters.CancellationToken);

if (!response.IsSuccessful)
return new LockResponse(response.StatusCode, response.Description);

var responseContent = await ReadContentAsString(response.Content).ConfigureAwait(false);

return _lockResponseParser.Parse(responseContent, response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -647,7 +690,9 @@ public async Task<WebDavResponse> Unlock([NotNull] Uri requestUri, [NotNull] Unl
};

var requestParams = new RequestParameters { Headers = headers };

var response = await _dispatcher.Send(requestUri, WebDavMethod.Unlock, requestParams, parameters.CancellationToken);

return new WebDavResponse(response.StatusCode, response.Description);
}

Expand Down Expand Up @@ -701,24 +746,31 @@ internal WebDavClient SetLockResponseParser([NotNull] IResponseParser<LockRespon

private static HttpClient ConfigureHttpClient(WebDavClientParams @params)
{
var httpHandler = new HttpClientHandler
HttpMessageHandler httpMessageHandler = @params.HttpMessageHandler;
if (httpMessageHandler == null)
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
PreAuthenticate = @params.PreAuthenticate,
UseDefaultCredentials = @params.UseDefaultCredentials,
UseProxy = @params.UseProxy
};

if (@params.Credentials != null)
{
httpHandler.Credentials = @params.Credentials;
}
if (@params.Proxy != null)
{
httpHandler.Proxy = @params.Proxy;
var httpHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
PreAuthenticate = @params.PreAuthenticate,
UseDefaultCredentials = @params.UseDefaultCredentials,
UseProxy = @params.UseProxy
};

if (@params.Credentials != null)
{
httpHandler.Credentials = @params.Credentials;
}

if (@params.Proxy != null)
{
httpHandler.Proxy = @params.Proxy;
}

httpMessageHandler = httpHandler;
}

var httpClient = new HttpClient(httpHandler, true)
var httpClient = new HttpClient(httpMessageHandler, true)
{
BaseAddress = @params.BaseAddress,
Timeout = @params.Timeout
Expand All @@ -728,6 +780,7 @@ private static HttpClient ConfigureHttpClient(WebDavClientParams @params)
{
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}

return httpClient;
}

Expand All @@ -738,14 +791,12 @@ private static Uri CreateUri(string requestUri)

private static Exception CreateInvalidUriException()
{
return
new InvalidOperationException(
"An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set.");
return new InvalidOperationException("An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set.");
}

private static Encoding GetResponseEncoding(HttpContent content, Encoding fallbackEncoding)
{
if (content.Headers.ContentType == null || content.Headers.ContentType.CharSet == null)
if (content.Headers.ContentType?.CharSet == null)
return fallbackEncoding;

try
Expand Down Expand Up @@ -783,6 +834,7 @@ private Uri GetAbsoluteUri(Uri uri)

if (_dispatcher.BaseAddress == null)
throw CreateInvalidUriException();

return new Uri(_dispatcher.BaseAddress, uri);
}

Expand Down
19 changes: 16 additions & 3 deletions src/WebDAV-Client/project.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "1.0.0.0",
"version": "1.0.1.0",
"title": "WebDAV-Client",
"description": "An easy-to-use async WebDAV client for .NETStandard, Portable and .NET 4.5 and up",
"authors": [ "Sergey Kazantsev", "Stef Heyenrath" ],
Expand All @@ -13,8 +13,8 @@
"url": "https://github.com/stefh/WebDAV-Client"
},
"projectUrl": "https://github.com/stefh/WebDAV-Client",
"licenseUrl": "https://raw.githubusercontent.com/stefh/WebDavClient/master/LICENSE.txt",
"releaseNotes": "Added NETStandard 1.1 and Portable"
"licenseUrl": "https://raw.githubusercontent.com/StefH/WebDAV-Client/master/LICENSE",
"releaseNotes": "Added new constructors and added support for UAP."
},

"dependencies": {
Expand Down Expand Up @@ -84,6 +84,19 @@
"System.Xml.XDocument": { "type": "build" },
"System.Xml.ReaderWriter": { "type": "build" }
}
},
"uap10.0": {
"buildOptions": { "define": [ "UAP" ] },
"dependencies": {
"System.Collections": "4.3.0",
"System.Diagnostics.Debug": "4.3.0",
"System.Linq": "4.3.0",
"System.Runtime": "4.3.0",
"System.Runtime.Extensions": "4.3.0",
"System.Text.RegularExpressions": "4.3.0",
"System.Net.Http": "4.3.0",
"System.Xml.XDocument": "4.3.0"
}
}
}
}

0 comments on commit 215133e

Please sign in to comment.