Skip to content

Commit

Permalink
Issue 15 (#16)
Browse files Browse the repository at this point in the history
- Fixed issue #15
- Added exception handling when trying to read Request/Response stream
  • Loading branch information
catalingavan authored Sep 26, 2019
1 parent 20f4202 commit 8c9e288
Show file tree
Hide file tree
Showing 15 changed files with 305 additions and 69 deletions.
6 changes: 3 additions & 3 deletions src/KissLog.AspNet.Mvc/KissLog.AspNet.Mvc.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@
<package >
<metadata>
<id>KissLog.AspNet.Mvc</id>
<version>3.4.0</version>
<version>3.4.1</version>
<authors>KissLog.net</authors>
<owners>KissLog.net</owners>
<licenseUrl>https://opensource.org/licenses/BSD-3-Clause</licenseUrl>
<projectUrl>http://kisslog.net</projectUrl>
<iconUrl>https://kisslog.net/cdn/KissLog/logos/32.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>KissLog ASP.NET MVC package. Install this package on ASP.NET MVC web applications.</description>
<releaseNotes>Adapted to KissLog 3.4.0 improvements</releaseNotes>
<releaseNotes>General improvements</releaseNotes>
<copyright>Copyright 2019</copyright>
<tags>KissLog, MVC, AspNet</tags>
<repository type="git" url="https://github.com/KissLog-net/KissLog.Sdk" />
<dependencies>
<dependency id="KissLog.AspNet.Web" version="3.4.0" />
<dependency id="KissLog.AspNet.Web" version="3.4.1" />
<dependency id="Microsoft.AspNet.Mvc" version="5.2.4" />
</dependencies>
</metadata>
Expand Down
4 changes: 2 additions & 2 deletions src/KissLog.AspNet.Mvc/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.4.0.0")]
[assembly: AssemblyFileVersion("3.4.0.0")]
[assembly: AssemblyVersion("3.4.1.0")]
[assembly: AssemblyFileVersion("3.4.1.0")]
4 changes: 2 additions & 2 deletions src/KissLog.AspNet.Web/KissLog.AspNet.Web.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
<package >
<metadata>
<id>KissLog.AspNet.Web</id>
<version>3.4.0</version>
<version>3.4.1</version>
<authors>KissLog.net</authors>
<owners>KissLog.net</owners>
<licenseUrl>https://opensource.org/licenses/BSD-3-Clause</licenseUrl>
<projectUrl>http://kisslog.net</projectUrl>
<iconUrl>https://kisslog.net/cdn/KissLog/logos/32.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>KissLog Web package. You should not manually install this package, as it will be installed as a dependency.</description>
<releaseNotes>Adapted to KissLog 3.4.0 improvements</releaseNotes>
<releaseNotes>General improvements</releaseNotes>
<copyright>Copyright 2019</copyright>
<tags>KissLog</tags>
<repository type="git" url="https://github.com/KissLog-net/KissLog.Sdk" />
Expand Down
59 changes: 41 additions & 18 deletions src/KissLog.AspNet.Web/KissLogHttpModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Linq;
using System.Reflection;
using System.Security.Claims;
using System.Text;
using System.Web;

namespace KissLog.AspNet.Web
Expand Down Expand Up @@ -152,6 +153,12 @@ private void EndRequest(object sender, EventArgs e)
}

WebRequestProperties properties = (WebRequestProperties)HttpContext.Current.Items[Constants.HttpRequestPropertiesKey];
if(properties == null)
{
// IIS redirect bypasses the BeginRequest() event
properties = WebRequestPropertiesFactory.Create(ctx.Request);
}

properties.EndDateTime = DateTime.UtcNow;

ResponseProperties response = WebResponsePropertiesFactory.Create(ctx.Response);
Expand All @@ -169,24 +176,7 @@ private void EndRequest(object sender, EventArgs e)

if (sniffer != null)
{
using (sniffer.MirrorStream)
{
sniffer.MirrorStream.Position = 0;

if (InternalHelpers.PreFilterShouldLogResponseBody(logger, sniffer.MirrorStream, response))
{
using (TemporaryFile tempFile = new TemporaryFile())
{
using (var fs = File.OpenWrite(tempFile.FileName))
{
sniffer.MirrorStream.CopyTo(fs);
}

string responseFileName = InternalHelpers.ResponseFileName(properties.Response.Headers);
logger.LogFile(tempFile.FileName, responseFileName);
}
}
}
LogResponse(logger, properties, response, sniffer);
}

logger.DataContainer.WebRequestProperties = properties;
Expand Down Expand Up @@ -216,6 +206,39 @@ private static void SetFactory()
factoryProperty.SetValue(Logger.Factory, loggerFactory, null);
}
}

private static void LogResponse(Logger logger, WebRequestProperties properties, ResponseProperties response, ResponseSniffer sniffer)
{
try
{
using (sniffer.MirrorStream)
{
sniffer.MirrorStream.Position = 0;

if (InternalHelpers.PreFilterShouldLogResponseBody(logger, sniffer.MirrorStream, response))
{
using (TemporaryFile tempFile = new TemporaryFile())
{
using (var fs = File.OpenWrite(tempFile.FileName))
{
sniffer.MirrorStream.CopyTo(fs);
}

string responseFileName = InternalHelpers.ResponseFileName(properties.Response.Headers);
logger.LogFile(tempFile.FileName, responseFileName);
}
}
}
}
catch(Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Error logging HTTP Response Content as file");
sb.AppendLine(ex.ToString());

KissLog.Internal.InternalHelpers.Log(sb.ToString(), LogLevel.Error);
}
}
}
}

4 changes: 2 additions & 2 deletions src/KissLog.AspNet.Web/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.4.0.0")]
[assembly: AssemblyFileVersion("3.4.0.0")]
[assembly: AssemblyVersion("3.4.1.0")]
[assembly: AssemblyFileVersion("3.4.1.0")]
6 changes: 3 additions & 3 deletions src/KissLog.AspNet.WebApi/KissLog.AspNet.WebApi.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@
<package >
<metadata>
<id>KissLog.AspNet.WebApi</id>
<version>3.4.0</version>
<version>3.4.1</version>
<authors>KissLog.net</authors>
<owners>KissLog.net</owners>
<licenseUrl>https://opensource.org/licenses/BSD-3-Clause</licenseUrl>
<projectUrl>http://kisslog.net</projectUrl>
<iconUrl>https://kisslog.net/cdn/KissLog/logos/32.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>KissLog ASP.NET WebApi package. Install this package on ASP.NET WebApi applications.</description>
<releaseNotes>Adapted to KissLog 3.4.0 improvements</releaseNotes>
<releaseNotes>General improvements</releaseNotes>
<copyright>Copyright 2019</copyright>
<tags>KissLog, WebApi, AspNet</tags>
<repository type="git" url="https://github.com/KissLog-net/KissLog.Sdk" />
<dependencies>
<dependency id="KissLog.AspNet.Web" version="3.4.0" />
<dependency id="KissLog.AspNet.Web" version="3.4.1" />
<dependency id="Microsoft.AspNet.WebApi.Core" version="5.2.4" />
</dependencies>
</metadata>
Expand Down
4 changes: 2 additions & 2 deletions src/KissLog.AspNet.WebApi/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.4.0.0")]
[assembly: AssemblyFileVersion("3.4.0.0")]
[assembly: AssemblyVersion("3.4.1.0")]
[assembly: AssemblyFileVersion("3.4.1.0")]
16 changes: 8 additions & 8 deletions src/KissLog.AspNetCore/KissLog.AspNetCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ Install this package on ASP.NET Core web applications.</Description>
<PackageIconUrl>https://kisslog.net/cdn/KissLog/logos/32.png</PackageIconUrl>
<PackageTags>KissLog, AspNetCore, NetCore, Core</PackageTags>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Version>2.4.0</Version>
<AssemblyVersion>2.4.0.0</AssemblyVersion>
<FileVersion>2.4.0.0</FileVersion>
<PackageReleaseNotes>Adapted to KissLog 3.4.0 improvements</PackageReleaseNotes>
<Version>2.4.2</Version>
<AssemblyVersion>2.4.2.0</AssemblyVersion>
<FileVersion>2.4.2.0</FileVersion>
<PackageReleaseNotes>Adapted to .NET Core 3.0</PackageReleaseNotes>
<PackageId>KissLog.AspNetCore</PackageId>
<RepositoryUrl>https://github.com/KissLog-net/KissLog.Sdk</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.0.1" />
<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.0.2" />
<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.1.1" />
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
</ItemGroup>

Expand Down
30 changes: 26 additions & 4 deletions src/KissLog.AspNetCore/KissLogMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace KissLog.AspNetCore
Expand Down Expand Up @@ -41,8 +42,8 @@ public async Task Invoke(HttpContext context)

await _next(context);

responseBodyFile = new TemporaryFile();
await ReadResponse(context.Response, responseBodyFile.FileName);
responseBodyFile = await ReadResponseAsync(context.Response);

contentLength = responseStream.Length;

if (CanWriteToResponseBody(context.Response))
Expand Down Expand Up @@ -96,21 +97,42 @@ public async Task Invoke(HttpContext context)
}
}

private async Task ReadResponse(HttpResponse response, string destinationFilePath)
private async Task<TemporaryFile> ReadResponseAsync(HttpResponse response)
{
TemporaryFile responseBodyFile = null;

try
{
responseBodyFile = new TemporaryFile();

response.Body.Seek(0, SeekOrigin.Begin);

using (var fs = File.OpenWrite(destinationFilePath))
using (var fs = File.OpenWrite(responseBodyFile.FileName))
{
await response.Body.CopyToAsync(fs);
}
}
catch(Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("KissLogMiddleware.ReadResponseAsync error");
sb.AppendLine(ex.ToString());

KissLog.Internal.InternalHelpers.Log(sb.ToString(), LogLevel.Error);

if(responseBodyFile != null)
{
responseBodyFile.Dispose();
}

responseBodyFile = null;
}
finally
{
response.Body.Seek(0, SeekOrigin.Begin);
}

return responseBodyFile;
}

private bool CanWriteToResponseBody(HttpResponse response)
Expand Down
96 changes: 95 additions & 1 deletion src/KissLog.AspNetCore/PackageInit.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
using KissLog.Internal;
using KissLog.AspNetCore.ReadInputStream;
using KissLog.Internal;
using System;
using System.Linq;
using System.Reflection;
using System.Text;

namespace KissLog.AspNetCore
{
internal static class PackageInit
{
private const string SdkName = "KissLog.AspNetCore";

internal static IReadInputStreamProvider ReadInputStreamProvider = new NullReadInputStreamProvider();

static string GetSdkVersion()
{
try
Expand All @@ -24,6 +29,7 @@ static string GetSdkVersion()
public static void Init()
{
SetFactory();
SetReadInputStreamProvider();

InternalHelpers.SdkName = SdkName;
InternalHelpers.SdkVersion = GetSdkVersion();
Expand All @@ -36,5 +42,93 @@ private static void SetFactory()
PropertyInfo factoryProperty = typeof(Logger).GetProperty("Factory");
factoryProperty.SetValue(Logger.Factory, loggerFactory, null);
}

private static void SetReadInputStreamProvider()
{
bool hasEnableBuffering = HasEnableBuffering();
if(hasEnableBuffering)
{
ReadInputStreamProvider = new EnableBufferingReadInputStreamProvider();
KissLog.Internal.InternalHelpers.Log($"ReadInputStreamProvider: {nameof(EnableBufferingReadInputStreamProvider)}", LogLevel.Information);

return;
}

bool hasEnableRewind = HasEnableRewind();
if(hasEnableRewind)
{
ReadInputStreamProvider = new EnableRewindReadInputStreamProvider();
KissLog.Internal.InternalHelpers.Log($"ReadInputStreamProvider: {nameof(EnableRewindReadInputStreamProvider)}", LogLevel.Information);

return;
}

ReadInputStreamProvider = new NullReadInputStreamProvider();
KissLog.Internal.InternalHelpers.Log($"ReadInputStreamProvider: {nameof(NullReadInputStreamProvider)}", LogLevel.Warning);
}

private static bool HasEnableBuffering()
{
bool result = false;

try
{
string assemblyName = "Microsoft.AspNetCore.Http";
string typeName = "Microsoft.AspNetCore.Http.HttpRequestRewindExtensions";
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName, typeName);

Type type = Type.GetType(assemblyQualifiedName, false);
if (type != null)
{
var enableBuffering = type
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.FirstOrDefault(m => m.Name == "EnableBuffering");

result = enableBuffering != null;
}
}
catch(Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Error trying to calculate HasEnableBuffering()");
sb.AppendLine(ex.ToString());

KissLog.Internal.InternalHelpers.Log(sb.ToString(), LogLevel.Error);
}

return result;
}

private static bool HasEnableRewind()
{
bool result = false;

try
{
string assemblyName = "Microsoft.AspNetCore.Http";
string typeName = "Microsoft.AspNetCore.Http.Internal.BufferingHelper";
string assemblyQualifiedName = Assembly.CreateQualifiedName(assemblyName, typeName);

Type type = Type.GetType(assemblyQualifiedName, false);
if (type != null)
{
var enableRewind = type
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.FirstOrDefault(m => m.Name == "EnableRewind");

result = enableRewind != null;
}
}
catch (Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("Error trying to calculate HasEnableRewind()");
sb.AppendLine(ex.ToString());

KissLog.Internal.InternalHelpers.Log(sb.ToString(), LogLevel.Error);
}

return result;
}
}
}
Loading

0 comments on commit 8c9e288

Please sign in to comment.