public void ParseCatchAllVerb() { var pattern = HttpRoutePattern.Parse("/a/{b=*}/**:verb"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a/{b}/{**__Discard_2}", adapter.ResolvedRouteTemplate); }
public void ParseManyVariables() { var pattern = HttpRoutePattern.Parse("/{a}/{b}/{c}"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/{a}/{b}/{c}", adapter.ResolvedRouteTemplate); }
public void ParseMultipleVariables() { var pattern = HttpRoutePattern.Parse("/shelves/{shelf}/books/{book}"); Assert.Null(pattern.Verb); Assert.Collection( pattern.Segments, s => Assert.Equal("shelves", s), s => Assert.Equal("*", s), s => Assert.Equal("books", s), s => Assert.Equal("*", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(2, v.EndSegment); Assert.Equal("shelf", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }, v => { Assert.Equal(3, v.StartSegment); Assert.Equal(4, v.EndSegment); Assert.Equal("book", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }); }
public void ParseSlash() { var pattern = HttpRoutePattern.Parse("/"); Assert.Empty(pattern.Segments); Assert.Empty(pattern.Variables); }
public void ParseMultipleVariables() { var pattern = HttpRoutePattern.Parse("/shelves/{shelf}/books/{book}"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/shelves/{shelf}/books/{book}", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseComplexNestedFieldPath() { var pattern = HttpRoutePattern.Parse("/a/{a.b.c=*}"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a/{a.b.c}", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseComplexCatchAll() { var pattern = HttpRoutePattern.Parse("/a/{b=**}"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a/{**b}", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseAnyAndCatchAllSegment2() { var pattern = HttpRoutePattern.Parse("/*/a/**"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/{__Discard_0}/a/{**__Discard_2}", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseVerb() { var pattern = HttpRoutePattern.Parse("/a:foo"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseAnySegment() { var pattern = HttpRoutePattern.Parse("/*") !; var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/{__Discard_0}", adapter.ResolvedRouteTemplate); Assert.Empty(adapter.RewriteVariableActions); }
public void ParseAnySegment() { var pattern = HttpRoutePattern.Parse("/*"); Assert.Collection( pattern.Segments, s => Assert.Equal("*", s)); Assert.Empty(pattern.Variables); }
public void ParseCatchAllSegment() { var pattern = HttpRoutePattern.Parse("/shelves/**"); Assert.Collection( pattern.Segments, s => Assert.Equal("shelves", s), s => Assert.Equal("**", s)); Assert.Empty(pattern.Variables); }
public void ParseVerb() { var pattern = HttpRoutePattern.Parse("/a:foo"); Assert.Equal("foo", pattern.Verb); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s)); Assert.Empty(pattern.Variables); }
public void ParseAnyAndCatchAllSegment2() { var pattern = HttpRoutePattern.Parse("/*/a/**"); Assert.Collection( pattern.Segments, s => Assert.Equal("*", s), s => Assert.Equal("a", s), s => Assert.Equal("**", s)); Assert.Empty(pattern.Variables); }
public void ParseNestedFieldPath() { var pattern = HttpRoutePattern.Parse("/a/{a.b.c}"); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s), s => Assert.Equal("*", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(2, v.EndSegment); Assert.Equal("a.b.c", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }); }
public void ParseComplexCatchAll() { var pattern = HttpRoutePattern.Parse("/a/{b=**}"); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s), s => Assert.Equal("**", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(2, v.EndSegment); Assert.Equal("b", string.Join(".", v.FieldPath)); Assert.True(v.HasCatchAllPath); }); }
public void ParseComplexPathCatchAll() { var pattern = HttpRoutePattern.Parse("/a/{b=c/**}"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a/c/{**__Complex_b_2}", adapter.ResolvedRouteTemplate); var httpContext = new DefaultHttpContext(); httpContext.Request.RouteValues = new RouteValueDictionary { { "__Complex_b_2", "value" } }; adapter.RewriteVariableActions[0](httpContext); Assert.Equal("c/value", httpContext.Request.RouteValues["b"]); }
public void ParseComplexPrefixSuffixCatchAll() { var pattern = HttpRoutePattern.Parse("/{x.y.z=a/**/b}/c/d"); var adapter = JsonTranscodingRouteAdapter.Parse(pattern); Assert.Equal("/a/{**__Complex_x.y.z_1:regex(b/c/d$)}", adapter.ResolvedRouteTemplate); var httpContext = new DefaultHttpContext(); httpContext.Request.RouteValues = new RouteValueDictionary { { "__Complex_x.y.z_1", "my/value/b/c/d" } }; adapter.RewriteVariableActions[0](httpContext); Assert.Equal("a/my/value/b", httpContext.Request.RouteValues["x.y.z"]); }
private static JsonTranscodingServerCallContext CreateServerCallContext(DefaultHttpContext httpContext) { return(new JsonTranscodingServerCallContext( httpContext, MethodOptions.Create(Enumerable.Empty <GrpcServiceOptions>()), new Method <object, object>( MethodType.Unary, "Server", "Method", new Marshaller <object>(o => null !, c => null !), new Marshaller <object>(o => null !, c => null !)), new CallHandlerDescriptorInfo( null, null, false, null, new Dictionary <string, List <FieldDescriptor> >(), JsonTranscodingRouteAdapter.Parse(HttpRoutePattern.Parse("/") !)), NullLogger.Instance)); }
public void ParseCatchAllVerb() { var pattern = HttpRoutePattern.Parse("/a/{b=*}/**:verb"); Assert.Equal("verb", pattern.Verb); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s), s => Assert.Equal("*", s), s => Assert.Equal("**", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(2, v.EndSegment); Assert.Equal("b", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }); }
public void ParseComplexPrefixSuffixSegment() { var pattern = HttpRoutePattern.Parse("/a/{b=c/*/d}"); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s), s => Assert.Equal("c", s), s => Assert.Equal("*", s), s => Assert.Equal("d", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(4, v.EndSegment); Assert.Equal("b", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }); }
public void ParseComplexVariable() { var route = HttpRoutePattern.Parse("/v1/{book.name=shelves/*/books/*}"); var adapter = JsonTranscodingRouteAdapter.Parse(route); Assert.Equal("/v1/shelves/{__Complex_book.name_2}/books/{__Complex_book.name_4}", adapter.ResolvedRouteTemplate); Assert.Single(adapter.RewriteVariableActions); var httpContext = new DefaultHttpContext(); httpContext.Request.RouteValues = new RouteValueDictionary { { "__Complex_book.name_2", "first" }, { "__Complex_book.name_4", "second" } }; adapter.RewriteVariableActions[0](httpContext); Assert.Equal("shelves/first/books/second", httpContext.Request.RouteValues["book.name"]); }
public void ParseComplexPrefixSuffixCatchAll() { var pattern = HttpRoutePattern.Parse("/{x.y.z=a/**/b}/c/d"); Assert.Collection( pattern.Segments, s => Assert.Equal("a", s), s => Assert.Equal("**", s), s => Assert.Equal("b", s), s => Assert.Equal("c", s), s => Assert.Equal("d", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(0, v.StartSegment); Assert.Equal(3, v.EndSegment); Assert.Equal("x.y.z", string.Join(".", v.FieldPath)); Assert.True(v.HasCatchAllPath); }); }
public void ParseComplexVariable() { var pattern = HttpRoutePattern.Parse("/v1/{book.name=shelves/*/books/*}"); Assert.Null(pattern.Verb); Assert.Collection( pattern.Segments, s => Assert.Equal("v1", s), s => Assert.Equal("shelves", s), s => Assert.Equal("*", s), s => Assert.Equal("books", s), s => Assert.Equal("*", s)); Assert.Collection( pattern.Variables, v => { Assert.Equal(1, v.StartSegment); Assert.Equal(5, v.EndSegment); Assert.Equal("book.name", string.Join(".", v.FieldPath)); Assert.False(v.HasCatchAllPath); }); }
public void Error(string pattern, string errorMessage) { var ex = Assert.Throws <InvalidOperationException>(() => HttpRoutePattern.Parse(pattern)); Assert.Equal(errorMessage, ex.InnerException !.Message); }
private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint, HttpRule httpRule, MethodDescriptor methodDescriptor, string pattern, string verb) { var apiDescription = new ApiDescription(); apiDescription.HttpMethod = verb; apiDescription.ActionDescriptor = new ActionDescriptor { RouteValues = new Dictionary <string, string?> { // Swagger uses this to group endpoints together. // Group methods together using the service name. ["controller"] = methodDescriptor.Service.FullName }, EndpointMetadata = routeEndpoint.Metadata.ToList() }; apiDescription.RelativePath = pattern.TrimStart('/'); apiDescription.SupportedRequestFormats.Add(new ApiRequestFormat { MediaType = "application/json" }); apiDescription.SupportedResponseTypes.Add(new ApiResponseType { ApiResponseFormats = { new ApiResponseFormat { MediaType = "application/json" } }, ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(methodDescriptor.OutputType.ClrType)), StatusCode = 200 }); var explorerSettings = routeEndpoint.Metadata.GetMetadata <ApiExplorerSettingsAttribute>(); if (explorerSettings != null) { apiDescription.GroupName = explorerSettings.GroupName; } var methodMetadata = routeEndpoint.Metadata.GetMetadata <GrpcMethodMetadata>() !; var httpRoutePattern = HttpRoutePattern.Parse(pattern); var routeParameters = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(httpRoutePattern.Variables.Select(v => v.FieldPath).ToList(), methodDescriptor.InputType); foreach (var routeParameter in routeParameters) { var field = routeParameter.Value.Last(); var parameterName = ServiceDescriptorHelpers.FormatUnderscoreName(field.Name, pascalCase: true, preservePeriod: false); var propertyInfo = field.ContainingType.ClrType.GetProperty(parameterName); // If from a property, create model as property to get its XML comments. var identity = propertyInfo != null ? ModelMetadataIdentity.ForProperty(propertyInfo, MessageDescriptorHelpers.ResolveFieldType(field), field.ContainingType.ClrType) : ModelMetadataIdentity.ForType(MessageDescriptorHelpers.ResolveFieldType(field)); apiDescription.ParameterDescriptions.Add(new ApiParameterDescription { Name = routeParameter.Key, ModelMetadata = new GrpcModelMetadata(identity), Source = BindingSource.Path, DefaultValue = string.Empty }); } var bodyDescriptor = ServiceDescriptorHelpers.ResolveBodyDescriptor(httpRule.Body, methodMetadata.ServiceType, methodDescriptor); if (bodyDescriptor != null) { // If from a property, create model as property to get its XML comments. var identity = bodyDescriptor.PropertyInfo != null ? ModelMetadataIdentity.ForProperty(bodyDescriptor.PropertyInfo, bodyDescriptor.Descriptor.ClrType, bodyDescriptor.PropertyInfo.DeclaringType !) : ModelMetadataIdentity.ForType(bodyDescriptor.Descriptor.ClrType); // Or if from a parameter, create model as parameter to get its XML comments. var parameterDescriptor = bodyDescriptor.ParameterInfo != null ? new ControllerParameterDescriptor { ParameterInfo = bodyDescriptor.ParameterInfo } : null; apiDescription.ParameterDescriptions.Add(new ApiParameterDescription { Name = "Input", ModelMetadata = new GrpcModelMetadata(identity), Source = BindingSource.Body, ParameterDescriptor = parameterDescriptor ! });