Skip to content

Commit

Permalink
Added full async support
Browse files Browse the repository at this point in the history
  • Loading branch information
Kees committed Oct 12, 2023
1 parent 7c4fb75 commit 9721bac
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 59 deletions.
7 changes: 5 additions & 2 deletions ChromiumHtmlToPdfConsole/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@ private static string ReplaceWildCards(string text)
/// <param name="options"></param>
private static void Convert(Options options)
{
var stopWatch = Stopwatch.StartNew();
var pageSettings = GetPageSettings(options);

using var converter = new Converter(options.ChromiumLocation, options.ChromiumUserProfile, _logger);
Expand All @@ -353,6 +354,9 @@ private static void Convert(Options options)
options.WaitForWindowStatusTimeOut,
options.Timeout,
options.MediaLoadTimeout);

stopWatch.Stop();
WriteToLog($"Conversion took {stopWatch.ElapsedMilliseconds} ms");
}
#endregion

Expand Down Expand Up @@ -437,8 +441,7 @@ internal static void WriteToLog(string message)
try
{
if (_logger == null) return;
using (_logger.BeginScope(null))
_logger.LogInformation(message);
_logger.LogInformation(message);
}
catch (ObjectDisposedException)
{
Expand Down
2 changes: 1 addition & 1 deletion ChromiumHtmlToPdfConsole/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"profiles": {
"ChromeHtmlToPdf": {
"commandName": "Project",
"commandLineArgs": "--input \"d:\\test.html\" --output d:\\test.pdf --log-network-traffic --media-load-timeout 5000 --image-resize true --image-load-timeout 5000 --paper-format A4 --sanitize-html"
"commandLineArgs": "--input \"https://www.google.nl\" --output d:\\test.pdf --log-network-traffic --media-load-timeout 5000 --image-resize true --image-load-timeout 5000 --paper-format A4 --sanitize-html"
}
}
}
42 changes: 33 additions & 9 deletions ChromiumHtmlToPdfLib/Browser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,7 @@
using ChromiumHtmlToPdfLib.Settings;
using Microsoft.Extensions.Logging;
using Base = ChromiumHtmlToPdfLib.Protocol.Network.Base;

// ReSharper disable MethodSupportsCancellation

// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable UnusedAutoPropertyAccessor.Global
// ReSharper disable UnusedMember.Global
// ReSharper disable AccessToDisposedClosure
// ReSharper disable AccessToModifiedClosure

Expand All @@ -54,7 +50,11 @@ namespace ChromiumHtmlToPdfLib;
/// <remarks>
/// See https://chromedevtools.github.io/devtools-protocol/
/// </remarks>
internal class Browser : IDisposable
#if (NETSTANDARD2_0)
public class Browser : IDisposable
#else
public class Browser : IDisposable, IAsyncDisposable
#endif
{
#region Fields
/// <summary>
Expand All @@ -70,12 +70,12 @@ internal class Browser : IDisposable
/// <summary>
/// A connection to the browser (Chrome or Edge)
/// </summary>
private readonly Connection _browserConnection;
private Connection _browserConnection;

/// <summary>
/// A connection to a page
/// </summary>
private readonly Connection _pageConnection;
private Connection _pageConnection;

private string _instanceId;
#endregion
Expand Down Expand Up @@ -655,7 +655,7 @@ internal async Task PrintToPdfAsync(Stream outputStream,
if (length > 0)
{
WriteToLog($"PDF chunk received with id {ioReadResponse.Id} and length {length}, writing it to output stream");
await outputStream.WriteAsync(bytes, 0, length);
await outputStream.WriteAsync(bytes, 0, length, cancellationToken);
}

if (!ioReadResponse.Result.Eof) continue;
Expand Down Expand Up @@ -749,4 +749,28 @@ public void Dispose()
_browserConnection?.Dispose();
}
#endregion

#region DisposeAsync
#if (!NETSTANDARD2_0)
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public async ValueTask DisposeAsync()
{
if (_pageConnection != null)
{
_pageConnection.OnError -= OnOnError;
await _pageConnection.DisposeAsync();
_pageConnection = null;
}

if (_pageConnection != null)
{
_browserConnection.OnError -= OnOnError;
await _browserConnection.DisposeAsync();
_browserConnection = null;
}
}
#endif
#endregion
}
58 changes: 43 additions & 15 deletions ChromiumHtmlToPdfLib/Connection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ namespace ChromiumHtmlToPdfLib;
/// <summary>
/// A connection to a page (tab) in Chromium
/// </summary>
internal class Connection : IDisposable
#if (NETSTANDARD2_0)
public class Connection : IDisposable
#else
public class Connection : IDisposable, IAsyncDisposable
#endif
{
#region Events
/// <summary>
Expand Down Expand Up @@ -328,9 +332,7 @@ internal void WriteToLog(string message)
{
if (_logger == null) return;
using (_logger.BeginScope(InstanceId))
{
_logger.LogInformation(message);
}
}
catch (ObjectDisposedException)
{
Expand All @@ -340,11 +342,15 @@ internal void WriteToLog(string message)
}
#endregion

#region Dispose
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
#region MessageToBytes
private static ArraySegment<byte> MessageToBytes(MessageBase message)
{
return new ArraySegment<byte>(Encoding.UTF8.GetBytes(message.ToJson()));
}
#endregion

#region InternalDisposeAsync
public async Task InternalDisposeAsync()
{
WriteToLog($"Disposing websocket connection to url '{_url}'");

Expand All @@ -360,19 +366,41 @@ public void Dispose()
if (_webSocket.State == WebSocketState.Open)
{
WriteToLog("Closing websocket");
_webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", default);
_receiveLoopCts.Cancel();
try
{
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", default);
WriteToLog("Websocket connection disposed gracefully");
}
finally
{
_receiveLoopCts.Cancel();
_webSocket.Dispose();
WriteToLog("Websocket connection disposed");
}
}
}
#endregion

_webSocket.Dispose();
WriteToLog("Websocket connection disposed");
#region Dispose
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
InternalDisposeAsync().GetAwaiter().GetResult();
}
#endregion

#region MessageToBytes
private static ArraySegment<byte> MessageToBytes(MessageBase message)
#region DisposeAsync
#if (!NETSTANDARD2_0)
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public async ValueTask DisposeAsync()
{
return new ArraySegment<byte>(Encoding.UTF8.GetBytes(message.ToJson()));
await InternalDisposeAsync();
GC.SuppressFinalize(this);
}
#endif
#endregion
}
28 changes: 12 additions & 16 deletions ChromiumHtmlToPdfLib/ConvertUri.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ namespace ChromiumHtmlToPdfLib;
/// </summary>
public class ConvertUri : Uri
{
#region Properties
/// <summary>
/// The encoding of the file that will be converted
/// </summary>
Expand All @@ -47,7 +48,9 @@ public class ConvertUri : Uri
/// The request headers to sent
/// </summary>
public Dictionary<string, string> RequestHeaders { get; }
#endregion

#region Constructor
/// <summary>
/// The uri to converter
/// </summary>
Expand All @@ -64,8 +67,7 @@ public ConvertUri(string uriString, Dictionary<string, string> requestHeaders =
/// <param name="uriString">The uri, e.g. file://c:\test.txt</param>
/// <param name="encoding">The encoding used for this file, e.g UTF-8</param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(string uriString, Encoding encoding, Dictionary<string, string> requestHeaders = null) :
base(uriString)
public ConvertUri(string uriString, Encoding encoding, Dictionary<string, string> requestHeaders = null) : base(uriString)
{
Encoding = encoding;
RequestHeaders = requestHeaders;
Expand All @@ -76,8 +78,7 @@ public ConvertUri(string uriString, Encoding encoding, Dictionary<string, string
/// </summary>
/// <param name="uriString">The uri, e.g. file://c:\test.txt</param>
/// <param name="encoding">The encoding used for this file, e.g UTF-8</param>
public ConvertUri(string uriString, string encoding, Dictionary<string, string> requestHeaders = null) :
base(uriString)
public ConvertUri(string uriString, string encoding, Dictionary<string, string> requestHeaders = null) : base(uriString)
{
Encoding = !string.IsNullOrWhiteSpace(encoding)
? Encoding.GetEncoding(encoding)
Expand All @@ -93,8 +94,7 @@ public ConvertUri(string uriString, string encoding, Dictionary<string, string>
/// <param name="uriString"></param>
/// <param name="dontEscape"></param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(string uriString, bool dontEscape, Dictionary<string, string> requestHeaders = null) : base(
uriString, dontEscape)
public ConvertUri(string uriString, bool dontEscape, Dictionary<string, string> requestHeaders = null) : base(uriString, dontEscape)
{
RequestHeaders = requestHeaders;
}
Expand All @@ -106,8 +106,7 @@ public ConvertUri(string uriString, bool dontEscape, Dictionary<string, string>
/// <param name="relativeUri"></param>
/// <param name="dontEscape"></param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(Uri baseUri, string relativeUri, bool dontEscape,
Dictionary<string, string> requestHeaders = null) : base(baseUri, relativeUri, dontEscape)
public ConvertUri(Uri baseUri, string relativeUri, bool dontEscape, Dictionary<string, string> requestHeaders = null) : base(baseUri, relativeUri, dontEscape)
{
RequestHeaders = requestHeaders;
}
Expand All @@ -119,8 +118,7 @@ public ConvertUri(Uri baseUri, string relativeUri, bool dontEscape,
/// <param name="uriString"></param>
/// <param name="uriKind"></param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(string uriString, UriKind uriKind, Dictionary<string, string> requestHeaders = null) : base(
uriString, uriKind)
public ConvertUri(string uriString, UriKind uriKind, Dictionary<string, string> requestHeaders = null) : base(uriString, uriKind)
{
RequestHeaders = requestHeaders;
}
Expand All @@ -131,8 +129,7 @@ public ConvertUri(string uriString, UriKind uriKind, Dictionary<string, string>
/// <param name="baseUri"></param>
/// <param name="relativeUri"></param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(Uri baseUri, string relativeUri, Dictionary<string, string> requestHeaders = null) : base(baseUri,
relativeUri)
public ConvertUri(Uri baseUri, string relativeUri, Dictionary<string, string> requestHeaders = null) : base(baseUri, relativeUri)
{
RequestHeaders = requestHeaders;
}
Expand All @@ -143,8 +140,7 @@ public ConvertUri(Uri baseUri, string relativeUri, Dictionary<string, string> re
/// <param name="baseUri"></param>
/// <param name="relativeUri"></param>
/// <param name="requestHeaders">The request headers to sent</param>
public ConvertUri(Uri baseUri, Uri relativeUri, Dictionary<string, string> requestHeaders = null) : base(baseUri,
relativeUri)
public ConvertUri(Uri baseUri, Uri relativeUri, Dictionary<string, string> requestHeaders = null) : base(baseUri, relativeUri)
{
RequestHeaders = requestHeaders;
}
Expand All @@ -155,9 +151,9 @@ public ConvertUri(Uri baseUri, Uri relativeUri, Dictionary<string, string> reque
/// <param name="serializationInfo"></param>
/// <param name="streamingContext"></param>
/// <param name="requestHeaders">The request headers to sent</param>
protected ConvertUri(SerializationInfo serializationInfo, StreamingContext streamingContext,
Dictionary<string, string> requestHeaders = null) : base(serializationInfo, streamingContext)
protected ConvertUri(SerializationInfo serializationInfo, StreamingContext streamingContext, Dictionary<string, string> requestHeaders = null) : base(serializationInfo, streamingContext)
{
RequestHeaders = requestHeaders;
}
#endregion
}
Loading

0 comments on commit 9721bac

Please sign in to comment.