DamianEdwards / MiniValidation

A minimalist validation library for .NET built atop the existing features in `System.ComponentModel.DataAnnotations` namespace
MIT License
321 stars 25 forks source link

InvalidOperationException when validating a target that contains a relative Uri property #46

Closed wazzamatazz closed 1 year ago

wazzamatazz commented 1 year ago

Related to #44.

When validating an object that contains a Uri property that specifies an absolute URI using MiniValidation @ 0.7.3, MiniValidator.TryValidate successfully validates the object. However, if you set the Uri property to specify a relative URI, MiniValidator.TryValidate throws an InvalidOperationException, ultimately caused by it getting Uri.Segments, which is not a valid operation on a relative URI.

Example code to reproduce:

static void Main() {
    var model = new Model() {
        Path = new Uri("./some-relative-path", UriKind.Relative)
    };

    if (!MiniValidator.TryValidate(model, out var errors)) {
        Console.WriteLine("fail");
    }
}

public class Model {

    [Required]
    public Uri Path { get; set; }

}

Example stack trace:

This operation is not supported for a relative URI.
   at System.Uri.get_Segments()
   at MiniValidation.PropertyHelper.CallNullSafePropertyGetter[TDeclaringType,TValue](Func`2 getter, Object target) in /_/src/MiniValidation/PropertyHelper.cs:line 129
   at MiniValidation.PropertyDetails.GetValue(Object target) in /_/src/MiniValidation/TypeDetailsCache.cs:line 208
   at MiniValidation.MiniValidator.TryValidateImpl(Object target, Boolean recurse, Boolean allowAsync, Dictionary`2 workingErrors, Dictionary`2 validatedObjects, List`1 validationResults, String prefix, Int32 currentDepth) in /_/src/MiniValidation/MiniValidator.cs:line 271
   at MiniValidation.MiniValidator.TryValidateImpl(Object target, Boolean recurse, Boolean allowAsync, Dictionary`2 workingErrors, Dictionary`2 validatedObjects, List`1 validationResults, String prefix, Int32 currentDepth) in /_/src/MiniValidation/MiniValidator.cs:line 334
   at MiniValidation.MiniValidator.TryValidate[TTarget](TTarget target, Boolean recurse, Boolean allowAsync, IDictionary`2& errors) in /_/src/MiniValidation/MiniValidator.cs:line 138
   at MiniValidation.MiniValidator.TryValidate[TTarget](TTarget target, IDictionary`2& errors) in /_/src/MiniValidation/MiniValidator.cs:line 64
   at UserQuery.Main(), line 6
DamianEdwards commented 1 year ago

Fix for this is available in 0.7.4 on NuGet: https://www.nuget.org/packages/MiniValidation/0.7.4

Thanks again for the reports!

wazzamatazz commented 1 year ago

Works like a charm now, thanks!