Skip to content

Commit ef55b2c

Browse files
authored
Merge pull request #2790 from microsoft/fix/path-parameter-with-slash-validation
fix: a bug where path parameter validation would fail if they contained forbidden JSON pointer characters
2 parents 1abb345 + 7d1de9e commit ef55b2c

File tree

5 files changed

+83
-9
lines changed

5 files changed

+83
-9
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/OpenApiHeaderValidationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void ValidateExamplesShouldNotHaveDataTypeMismatchForSimpleSchema()
8686
// Act
8787
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
8888
var walker = new OpenApiWalker(validator);
89-
walker.Walk(header);
89+
walker.Walk((IOpenApiHeader)header);
9090

9191
warnings = validator.Warnings;
9292
var result = !warnings.Any();

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

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void ValidateExampleShouldNotHaveDataTypeMismatchForSimpleSchema()
7575
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
7676
validator.Enter("{parameter1}");
7777
var walker = new OpenApiWalker(validator);
78-
walker.Walk(parameter);
78+
walker.Walk((IOpenApiParameter)parameter);
7979

8080
warnings = validator.Warnings;
8181
var result = !warnings.Any();
@@ -203,13 +203,78 @@ public void PathParameterInThePathShouldBeOk()
203203
validator.Enter("1");
204204

205205
var walker = new OpenApiWalker(validator);
206-
walker.Walk(parameter);
206+
walker.Walk((IOpenApiParameter)parameter);
207207

208208
errors = validator.Errors;
209209
var result = errors.Any();
210210

211211
// Assert
212212
Assert.False(result);
213213
}
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);
242+
243+
errors = validator.Errors;
244+
var result = errors.Any();
245+
246+
// Assert
247+
Assert.False(result);
248+
}
249+
250+
[Fact]
251+
public void PathParameterValidationShouldNotThrowWithEmptyParameterName()
252+
{
253+
// Arrange
254+
var parameter = new OpenApiParameter
255+
{
256+
Name = string.Empty,
257+
In = ParameterLocation.Path,
258+
Required = true,
259+
Schema = new OpenApiSchema()
260+
{
261+
Type = JsonSchemaType.String,
262+
}
263+
};
264+
265+
// Act
266+
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
267+
validator.Enter("paths");
268+
validator.Enter("/{}");
269+
validator.Enter("get");
270+
validator.Enter("parameters");
271+
validator.Enter("1");
272+
273+
var walker = new OpenApiWalker(validator);
274+
var exception = Record.Exception(() => walker.Walk((IOpenApiParameter)parameter));
275+
276+
// Assert
277+
Assert.Null(exception);
278+
}
214279
}
215280
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void ValidateDefaultShouldNotHaveDataTypeMismatchForSimpleSchema()
2626
// Act
2727
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
2828
var walker = new OpenApiWalker(validator);
29-
walker.Walk(schema);
29+
walker.Walk((IOpenApiSchema)schema);
3030

3131
warnings = validator.Warnings;
3232
var result = !warnings.Any();
@@ -50,7 +50,7 @@ public void ValidateExampleAndDefaultShouldNotHaveDataTypeMismatchForSimpleSchem
5050
// Act
5151
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
5252
var walker = new OpenApiWalker(validator);
53-
walker.Walk(schema);
53+
walker.Walk((IOpenApiSchema)schema);
5454

5555
warnings = validator.Warnings;
5656
bool result = !warnings.Any();
@@ -92,7 +92,7 @@ public void ValidateEnumShouldNotHaveDataTypeMismatchForSimpleSchema()
9292
// Act
9393
var validator = new OpenApiValidator(ValidationRuleSet.GetDefaultRuleSet());
9494
var walker = new OpenApiWalker(validator);
95-
walker.Walk(schema);
95+
walker.Walk((IOpenApiSchema)schema);
9696

9797
warnings = validator.Warnings;
9898
var result = !warnings.Any();

0 commit comments

Comments
 (0)