Skip to content

Commit 5f0a72e

Browse files
Updates addressing Copilot's feedback
1 parent 78b9d7f commit 5f0a72e

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

DevProxy.Plugins/Mocking/MockResponsePlugin.cs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
530530

531531
try
532532
{
533-
var requestBody = JsonSerializer.Deserialize<dynamic>(request.BodyString, ProxyUtils.JsonSerializerOptions);
533+
var requestBody = JsonSerializer.Deserialize<JsonElement>(request.BodyString, ProxyUtils.JsonSerializerOptions);
534534

535535
response.Body = ReplacePlaceholdersInObject(response.Body, requestBody, logger);
536536
}
@@ -543,7 +543,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
543543
logger.LogTrace("Left {Method}", nameof(ReplacePlaceholders));
544544
}
545545

546-
private static object? ReplacePlaceholdersInObject(object? obj, dynamic requestBody, ILogger logger)
546+
private static object? ReplacePlaceholdersInObject(object? obj, JsonElement requestBody, ILogger logger)
547547
{
548548
logger.LogTrace("{Method} called", nameof(ReplacePlaceholdersInObject));
549549

@@ -570,7 +570,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
570570
return ReplacePlaceholdersInJsonElement(jsonElement, requestBody, logger);
571571
}
572572

573-
private static object? ReplacePlaceholdersInJsonElement(JsonElement element, dynamic requestBody, ILogger logger)
573+
private static object? ReplacePlaceholdersInJsonElement(JsonElement element, JsonElement requestBody, ILogger logger)
574574
{
575575
logger.LogTrace("{Method} called", nameof(ReplacePlaceholdersInJsonElement));
576576

@@ -594,7 +594,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
594594
case JsonValueKind.String:
595595
return ReplacePlaceholderInString(element.GetString() ?? "", requestBody, logger);
596596
case JsonValueKind.Number:
597-
return element.GetDecimal();
597+
return GetSafeNumber(element, logger);
598598
case JsonValueKind.True:
599599
return true;
600600
case JsonValueKind.False:
@@ -608,7 +608,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
608608
}
609609

610610
#pragma warning disable CA1859 // Return type must be object because we can return any type from the request
611-
private static object? ReplacePlaceholderInString(string value, dynamic requestBody, ILogger logger)
611+
private static object? ReplacePlaceholderInString(string value, JsonElement requestBody, ILogger logger)
612612
#pragma warning restore CA1859
613613
{
614614
logger.LogTrace("{Method} called", nameof(ReplacePlaceholderInString));
@@ -630,7 +630,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
630630
return GetValueFromRequestBody(requestBody, propertyPath, logger);
631631
}
632632

633-
private static object? GetValueFromRequestBody(dynamic requestBody, string propertyPath, ILogger logger)
633+
private static object? GetValueFromRequestBody(JsonElement requestBody, string propertyPath, ILogger logger)
634634
{
635635
logger.LogTrace("{Method} called", nameof(GetValueFromRequestBody));
636636

@@ -657,6 +657,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
657657
catch
658658
{
659659
// If we can't get the property, return null
660+
logger.LogDebug("Failed to get value for {PropertyPath}. Returning null", propertyPath);
660661
}
661662

662663
return null;
@@ -694,7 +695,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
694695
return element.ValueKind switch
695696
{
696697
JsonValueKind.String => element.GetString(),
697-
JsonValueKind.Number => element.GetDecimal(),
698+
JsonValueKind.Number => GetSafeNumber(element, logger),
698699
JsonValueKind.True => true,
699700
JsonValueKind.False => false,
700701
JsonValueKind.Null or JsonValueKind.Undefined => null,
@@ -704,4 +705,31 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
704705
_ => element.ToString(),
705706
};
706707
}
708+
709+
// Attempts to safely extract a number from a JsonElement, falling back to double or string if necessary
710+
private static object? GetSafeNumber(JsonElement element, ILogger logger)
711+
{
712+
logger.LogTrace("{Method} called", nameof(GetSafeNumber));
713+
714+
// Try to get as int
715+
if (element.TryGetInt32(out var intValue))
716+
{
717+
return intValue;
718+
}
719+
if (element.TryGetInt64(out var longValue))
720+
{
721+
return longValue;
722+
}
723+
if (element.TryGetDecimal(out var decimalValue))
724+
{
725+
return decimalValue;
726+
}
727+
if (element.TryGetDouble(out var doubleValue))
728+
{
729+
return doubleValue;
730+
}
731+
732+
// Fallback: return as string to avoid exceptions
733+
return element.GetRawText();
734+
}
707735
}

0 commit comments

Comments
 (0)