Skip to content

Commit dd3bdab

Browse files
committed
Improve error message for missing http action arguments
1 parent ef041b6 commit dd3bdab

4 files changed

Lines changed: 36 additions & 13 deletions

File tree

src/Dibix.Http.Server/Providers/ArgumentsSourceProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ internal abstract class ArgumentsSourceProvider : NonUserParameterSourceProvider
66
{
77
public override void Resolve(IHttpParameterResolutionContext context)
88
{
9-
Expression value = HttpParameterResolverUtility.BuildArgumentAccessorExpression(context.ArgumentsParameter, context.PropertyPath);
9+
Expression value = HttpParameterResolverUtility.BuildReadableArgumentAccessorExpression(context.ArgumentsParameter, context.PropertyPath);
1010
context.ResolveUsingValue(value);
1111
}
1212
}

src/Dibix.Http.Server/Runtime/HttpParameterResolver.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ private static void CollectUriParameterAssignment(IHttpActionDescriptor action,
371371
// arguments["lcid"] = CONVERT(arguments["lcid"])
372372
if (parameter.Converter != null)
373373
{
374-
Expression value = HttpParameterResolverUtility.BuildArgumentAccessorExpression(argumentsParameter, parameter.InternalParameterName);
374+
Expression value = HttpParameterResolverUtility.BuildReadableArgumentAccessorExpression(argumentsParameter, parameter.InternalParameterName);
375375
value = CollectConverterStatement(parameter, value, actionParameter, dependencyResolverParameter);
376376
CollectParameterAssignment(compilationContext, parameter.InternalParameterName, argumentsParameter, value);
377377
}
@@ -434,7 +434,7 @@ private static void CollectBodyParameterBindingAssignment(CompilationContext com
434434

435435
private static void CollectParameterAssignment(CompilationContext compilationContext, string parameterName, Expression argumentsParameter, Expression value)
436436
{
437-
Expression property = HttpParameterResolverUtility.BuildArgumentAccessorExpression(argumentsParameter, parameterName);
437+
Expression property = HttpParameterResolverUtility.BuildWritableArgumentAccessorExpression(argumentsParameter, parameterName);
438438
Expression valueCast = Expression.Convert(value, typeof(object));
439439
Expression assign = Expression.Assign(property, valueCast);
440440
compilationContext.Statements.Add(assign);
@@ -452,7 +452,7 @@ private static Expression CollectParameterValue(IHttpActionDescriptor action, Ex
452452

453453
case HttpParameterSourceKind.Query:
454454
case HttpParameterSourceKind.Path:
455-
value = HttpParameterResolverUtility.BuildArgumentAccessorExpression(argumentsParameter, parameter.InternalParameterName);
455+
value = HttpParameterResolverUtility.BuildReadableArgumentAccessorExpression(argumentsParameter, parameter.InternalParameterName);
456456
break;
457457

458458
case HttpParameterSourceKind.SourceInstance:

src/Dibix.Http.Server/Runtime/HttpParameterResolverUtility.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,18 @@ public static TResult ReadArgument<TResult>(IDictionary<string, object> argument
2424

2525
public static TBody ReadBody<TBody>(IDictionary<string, object> arguments) => ReadArgument<TBody>(arguments, HttpParameterName.Body);
2626

27-
public static Expression BuildArgumentAccessorExpression(Expression argumentsParameter, string key)
27+
public static Expression BuildWritableArgumentAccessorExpression(Expression argumentsParameter, string key)
2828
{
2929
Expression argumentsKey = Expression.Constant(key);
3030
Expression property = Expression.Property(argumentsParameter, "Item", argumentsKey);
3131
return property;
3232
}
33+
34+
public static Expression BuildReadableArgumentAccessorExpression(Expression argumentsParameter, string key)
35+
{
36+
Expression argumentsKey = Expression.Constant(key);
37+
Expression call = Expression.Call(typeof(HttpParameterResolverUtility), nameof(ReadArgument), new[] { typeof(object) }, argumentsParameter, argumentsKey);
38+
return call;
39+
}
3340
}
3441
}

tests/Dibix.Http.Server.Tests/HttpParameterResolverTest.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,9 @@ public void Compile_ImplicitBodySource()
290290
$input.localeid = $bodySource.LocaleId;
291291
$input.fromuri = .Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
292292
""fromuri"",
293-
$arguments.Item[""fromuri""],
293+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
294+
$arguments,
295+
""fromuri""),
294296
$action);
295297
$arguments.Item[""input""] = (System.Object)$input
296298
}
@@ -691,7 +693,9 @@ public void Compile_QuerySource()
691693
} .Else {
692694
.Default(System.Void)
693695
};
694-
$arguments.Item[""name""] = (System.Object)$arguments.Item[""name_""];
696+
$arguments.Item[""name""] = (System.Object).Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
697+
$arguments,
698+
""name_"");
695699
.If (
696700
.Call $arguments.TryGetValue(
697701
""name"",
@@ -703,9 +707,13 @@ public void Compile_QuerySource()
703707
};
704708
$arguments.Item[""name""] = (System.Object).Call Dibix.Http.Server.Tests.HttpParameterResolverTest+EncryptionHttpParameterConverter.Convert(.Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
705709
""name"",
706-
$arguments.Item[""name""],
710+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
711+
$arguments,
712+
""name""),
707713
$action));
708-
$arguments.Item[""true""] = (System.Object)$arguments.Item[""true_""];
714+
$arguments.Item[""true""] = (System.Object).Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
715+
$arguments,
716+
""true_"");
709717
.If (
710718
.Call $arguments.TryGetValue(
711719
""true"",
@@ -718,11 +726,15 @@ public void Compile_QuerySource()
718726
$input = .New Dibix.Http.Server.Tests.HttpParameterResolverTest+ExplicitHttpUriParameterInput();
719727
$input.targetid = .Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
720728
""targetid"",
721-
$arguments.Item[""targetid""],
729+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
730+
$arguments,
731+
""targetid""),
722732
$action);
723733
$input.targetname = .Call Dibix.Http.Server.Tests.HttpParameterResolverTest+EncryptionHttpParameterConverter.Convert(.Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
724734
""targetname"",
725-
$arguments.Item[""targetname_""],
735+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
736+
$arguments,
737+
""targetname_""),
726738
$action));
727739
$arguments.Item[""input""] = (System.Object)$input
728740
}
@@ -819,11 +831,15 @@ public void Compile_PathSource()
819831
$input = .New Dibix.Http.Server.Tests.HttpParameterResolverTest+ExplicitHttpUriParameterInput();
820832
$input.targetid = .Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
821833
""targetid"",
822-
$arguments.Item[""targetid""],
834+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
835+
$arguments,
836+
""targetid""),
823837
$action);
824838
$input.targetname = .Call Dibix.Http.Server.Tests.HttpParameterResolverTest+EncryptionHttpParameterConverter.Convert(.Call Dibix.Http.Server.HttpParameterResolver.ConvertValue(
825839
""targetname"",
826-
$arguments.Item[""targetname_""],
840+
.Call Dibix.Http.Server.HttpParameterResolverUtility.ReadArgument(
841+
$arguments,
842+
""targetname_""),
827843
$action));
828844
$arguments.Item[""input""] = (System.Object)$input
829845
}

0 commit comments

Comments
 (0)