Skip to content

Commit 4153edd

Browse files
authored
Issue fix (Azure#51573)
1 parent fcbc445 commit 4153edd

File tree

6 files changed

+69
-10
lines changed

6 files changed

+69
-10
lines changed

sdk/network/Azure.ResourceManager.Network/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
### Bugs Fixed
1010

11+
- Fixed an issue in `ManagedRuleSetRuleGroup` deserialization where rule IDs could be either strings or numbers in JSON, causing `InvalidOperationException` when parsing mixed-type arrays.
12+
1113
### Other Changes
1214

1315
## 1.11.1 (2025-07-01)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
#nullable disable
5+
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Runtime.CompilerServices;
9+
using System.Text.Json;
10+
using Azure.Core;
11+
12+
namespace Azure.ResourceManager.Network.Models
13+
{
14+
// Custom deserialization hook for handling mixed-type rule arrays.
15+
// Addresses issue where WAF rule IDs can be either strings or numbers in JSON.
16+
[CodeGenSerialization(nameof(Rules), DeserializationValueHook = nameof(DeserializeNumberValue))]
17+
public partial class ManagedRuleSetRuleGroup
18+
{
19+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
20+
private static void DeserializeNumberValue(JsonProperty property, ref IReadOnlyList<string> rules)
21+
{
22+
if (property.Value.ValueKind == JsonValueKind.Null)
23+
return;
24+
25+
rules = [.. property.Value.EnumerateArray()
26+
.Select(item => item.ValueKind == JsonValueKind.String
27+
? item.GetString()
28+
: item.GetInt32().ToString())];
29+
}
30+
}
31+
}

sdk/network/Azure.ResourceManager.Network/src/Generated/Models/ManagedRuleSetRuleGroup.Serialization.cs

Lines changed: 1 addition & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/network/Azure.ResourceManager.Network/tests/Azure.ResourceManager.Network.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
<None Update="TestData\DeploymentTemplate.json">
1212
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
1313
</None>
14+
<None Update="TestData\ManagedRuleSetRuleGroup.json">
15+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
16+
</None>
1417
<None Update="TestData\VmssDeploymentTemplate.json">
1518
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1619
</None>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"ruleGroupName": "OWASP_3.2",
3+
"description": "OWASP Core Rule Set 3.2",
4+
"rules": [
5+
"920100",
6+
920110,
7+
"920120",
8+
920130,
9+
"920140",
10+
920150
11+
]
12+
}

sdk/network/Azure.ResourceManager.Network/tests/Tests/UnitTest.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,25 @@ public void DeserializeChangeNumber()
1919
var data = AzureFirewallIPGroups.DeserializeAzureFirewallIPGroups(jsonContent.RootElement);
2020
Assert.NotNull(data.ChangeNumber);
2121
}
22+
23+
// Regression test for ManagedRuleSetRuleGroup deserialization with mixed string/number rule IDs
24+
[Test]
25+
public void DeserializeManagedRuleSetRuleGroupWithMixedRuleTypes()
26+
{
27+
using var sr = new StreamReader(Path.Combine("TestData", "ManagedRuleSetRuleGroup.json"));
28+
using var jsonContent = JsonDocument.Parse(sr.BaseStream);
29+
var data = ManagedRuleSetRuleGroup.DeserializeManagedRuleSetRuleGroup(jsonContent.RootElement);
30+
31+
Assert.NotNull(data.Rules);
32+
Assert.AreEqual(6, data.Rules.Count);
33+
34+
// Verify that both string and numeric rule IDs are properly converted to strings
35+
Assert.AreEqual("920100", data.Rules[0]); // Originally string
36+
Assert.AreEqual("920110", data.Rules[1]); // Originally number
37+
Assert.AreEqual("920120", data.Rules[2]); // Originally string
38+
Assert.AreEqual("920130", data.Rules[3]); // Originally number
39+
Assert.AreEqual("920140", data.Rules[4]); // Originally string
40+
Assert.AreEqual("920150", data.Rules[5]); // Originally number
41+
}
2242
}
2343
}

0 commit comments

Comments
 (0)