Skip to content

Commit

Permalink
feat: support ipv4 only hosts (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
brettdavis-bmw authored and FantasticFiasco committed Mar 27, 2019
1 parent 346747b commit 6603d8a
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 18 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ This project adheres to [Semantic Versioning](http://semver.org/) and is followi

## Unreleased

### :syringe: Fixed

- [#42](https://github.com/FantasticFiasco/serilog-sinks-udp/pull/42) Revert to support IPv4 on networks without IPv6 (contribution by [brettdavis-bmw](https://github.com/brettdavis-bmw))

## [5.0.1] - 2019-01-07

### :zap: Added
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<VersionPrefix>5.0.1</VersionPrefix>
<VersionPrefix>6.0.0-beta1</VersionPrefix>
<Authors>Mattias Kindborg</Authors>
<Company />
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
Expand Down
1 change: 1 addition & 0 deletions serilog-sinks-udp.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpRenamePlacementToArrangementMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
Expand Down
20 changes: 14 additions & 6 deletions src/Serilog.Sinks.Udp/LoggerSinkConfigurationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public static class LoggerSinkConfigurationExtensions
/// <param name="formatProvider">
/// Supplies culture-specific formatting information, or null.
/// </param>
/// <param name="useIpv6">Use Ipv6 dual socket mode.</param>
/// <returns>
/// Logger configuration, allowing configuration to continue.
/// </returns>
Expand All @@ -78,7 +79,8 @@ public static LoggerConfiguration Udp(
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
LoggingLevelSwitch levelSwitch = null,
string outputTemplate = DefaultOutputTemplate,
IFormatProvider formatProvider = null)
IFormatProvider formatProvider = null,
bool useIpv6 = true)
{
if (sinkConfiguration == null) throw new ArgumentNullException(nameof(sinkConfiguration));
if (outputTemplate == null) throw new ArgumentNullException(nameof(outputTemplate));
Expand All @@ -92,7 +94,8 @@ public static LoggerConfiguration Udp(
formatter,
localPort,
restrictedToMinimumLevel,
levelSwitch);
levelSwitch,
useIpv6);
}

/// <summary>
Expand Down Expand Up @@ -185,6 +188,7 @@ public static LoggerConfiguration Udp(
/// <param name="levelSwitch">
/// A switch allowing the pass-through minimum level to be changed at runtime.
/// </param>
/// <param name="useIpv6">Use Ipv6 dual socket mode.</param>
/// <returns>
/// Logger configuration, allowing configuration to continue.
/// </returns>
Expand All @@ -195,13 +199,14 @@ public static LoggerConfiguration Udp(
ITextFormatter formatter,
int localPort = 0,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
LoggingLevelSwitch levelSwitch = null)
LoggingLevelSwitch levelSwitch = null,
bool useIpv6 = true)
{
if (sinkConfiguration == null) throw new ArgumentNullException(nameof(sinkConfiguration));

try
{
var client = UdpClientFactory.Create(localPort);
var client = UdpClientFactory.Create(localPort, useIpv6);
var sink = new UdpSink(client, remoteAddress, remotePort, formatter);

return sinkConfiguration.Sink(sink, restrictedToMinimumLevel, levelSwitch);
Expand Down Expand Up @@ -242,6 +247,7 @@ public static LoggerConfiguration Udp(
/// <param name="levelSwitch">
/// A switch allowing the pass-through minimum level to be changed at runtime.
/// </param>
/// <param name="useIpv6">Use Ipv6 dual socket mode.</param>
/// <returns>
/// Logger configuration, allowing configuration to continue.
/// </returns>
Expand All @@ -252,7 +258,8 @@ public static LoggerConfiguration Udp(
ITextFormatter formatter,
int localPort = 0,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
LoggingLevelSwitch levelSwitch = null)
LoggingLevelSwitch levelSwitch = null,
bool useIpv6 = true)
{
return Udp(
sinkConfiguration,
Expand All @@ -261,7 +268,8 @@ public static LoggerConfiguration Udp(
formatter,
localPort,
restrictedToMinimumLevel,
levelSwitch
levelSwitch,
useIpv6
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Serilog.Sinks.Udp/Serilog.Sinks.Udp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<ItemGroup>
<PackageReference Include="Serilog.Sinks.PeriodicBatching" Version="2.*" />
<!-- SourceLink -->
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All"/>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0-beta2-18618-05" PrivateAssets="All" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net45' Or '$(TargetFramework)' == 'net461'">
Expand Down
4 changes: 2 additions & 2 deletions src/Serilog.Sinks.Udp/Sinks/Udp/Private/UdpClientFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static class UdpClientFactory
/// <summary>
/// Gets or sets the factory creating instances of <see cref="IUdpClient"/>.
/// </summary>
public static Func<int, IUdpClient> Create { get; set; }
= localPort => new UdpClientWrapper(localPort);
public static Func<int, bool, IUdpClient> Create { get; set; }
= (localPort, useIpv6) => new UdpClientWrapper(localPort, useIpv6);
}
}
13 changes: 8 additions & 5 deletions src/Serilog.Sinks.Udp/Sinks/Udp/Private/UdpClientWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,19 @@ internal class UdpClientWrapper : IUdpClient
{
private readonly UdpClient client;

public UdpClientWrapper(int localPort)
public UdpClientWrapper(int localPort, bool useIpv6)
{
if (localPort < IPEndPoint.MinPort || localPort > IPEndPoint.MaxPort) throw new ArgumentOutOfRangeException(nameof(localPort));

var addressFamily = useIpv6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;
client = localPort == 0
? new UdpClient(AddressFamily.InterNetworkV6)
: new UdpClient(localPort, AddressFamily.InterNetworkV6);
? new UdpClient(addressFamily)
: new UdpClient(localPort, addressFamily);

// Allow for IPv4 mapped addresses over IPv6
client.Client.DualMode = true;
if (useIpv6)
{
client.Client.DualMode = true;
}
}

public Task<int> SendAsync(byte[] datagram, int bytes, IPEndPoint endPoint)
Expand Down
4 changes: 2 additions & 2 deletions test/Serilog.Sinks.Udp.Tests/SinkFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ namespace Serilog
{
public abstract class SinkFixture : IDisposable
{
private readonly Func<int, IUdpClient> originalFactory;
private readonly Func<int, bool, IUdpClient> originalFactory;
private readonly UdpClientMock client;

protected SinkFixture()
{
originalFactory = UdpClientFactory.Create;

client = new UdpClientMock();
UdpClientFactory.Create = _ => client.Object;
UdpClientFactory.Create = (port, useIpv6) => client.Object;
}

protected abstract string RemoteAddress { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class UdpClientFactoryShould : IDisposable

public UdpClientFactoryShould()
{
client = UdpClientFactory.Create(0);
client = UdpClientFactory.Create(0, true);
}

[Theory]
Expand Down

0 comments on commit 6603d8a

Please sign in to comment.