Skip to content

Commit 4b3164a

Browse files
committed
fix: a bug where path parameter validation would fail if they contained forbidden JSON pointer characters
Signed-off-by: Vincent Biret <vibiret@microsoft.com>
1 parent 1abb345 commit 4b3164a

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

src/Microsoft.OpenApi/Services/OpenApiVisitorBase.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,19 @@ public virtual void Enter(string segment)
3333
this._path.Push(string.Empty);
3434
return;
3535
}
36+
this._path.Push(EncodeJsonPointerSegment(segment));
37+
}
38+
39+
internal static string EncodeJsonPointerSegment(string? segment)
40+
{
41+
if (string.IsNullOrEmpty(segment))
42+
{
43+
return string.Empty;
44+
}
3645
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP1_0_OR_GREATER
37-
this._path.Push(segment.Replace("~", "~0", StringComparison.Ordinal).Replace("/", "~1", StringComparison.OrdinalIgnoreCase));
46+
return segment.Replace("~", "~0", StringComparison.Ordinal).Replace("/", "~1", StringComparison.OrdinalIgnoreCase);
3847
#else
39-
this._path.Push(segment.Replace("~", "~0").Replace("/", "~1"));
48+
return segment!.Replace("~", "~0").Replace("/", "~1");
4049
#endif
4150
}
4251

src/Microsoft.OpenApi/Validations/Rules/OpenApiParameterRules.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static class OpenApiParameterRules
6161
(context, parameter) =>
6262
{
6363
if (parameter.In == ParameterLocation.Path &&
64-
!(context.PathString.Contains("{" + parameter.Name + "}") || context.PathString.Contains("#/components")))
64+
!(context.PathString.Contains("{" + OpenApiVisitorBase.EncodeJsonPointerSegment(parameter.Name) + "}") || context.PathString.Contains("#/components")))
6565
{
6666
context.Enter("in");
6767
context.CreateError(

test/Microsoft.OpenApi.Tests/Validations/OpenApiParameterValidationTests.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,42 @@ public void PathParameterInThePathShouldBeOk()
203203
validator.Enter("1");
204204

205205
var walker = new OpenApiWalker(validator);
206-
walker.Walk(parameter);
206+
walker.Walk((IOpenApiParameter)parameter);
207+
208+
errors = validator.Errors;
209+
var result = errors.Any();
210+
211+
// Assert
212+
Assert.False(result);
213+
}
214+
215+
[Fact]
216+
public void PathParameterInThePathShouldBeOkWithSlashInParameterName()
217+
{
218+
// Arrange
219+
IEnumerable<OpenApiError> errors;
220+
221+
var parameter = new OpenApiParameter
222+
{
223+
Name = "parameter/1",
224+
In = ParameterLocation.Path,
225+
Required = true,
226+
Schema = new OpenApiSchema()
227+
{
228+
Type = JsonSchemaType.String,
229+
}
230+
};
231+
232+
// Act
233+
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
234+
validator.Enter("paths");
235+
validator.Enter("/{parameter/1}");
236+
validator.Enter("get");
237+
validator.Enter("parameters");
238+
validator.Enter("1");
239+
240+
var walker = new OpenApiWalker(validator);
241+
walker.Walk((IOpenApiParameter)parameter);
207242

208243
errors = validator.Errors;
209244
var result = errors.Any();

0 commit comments

Comments
 (0)