Example #1
0
        public void GetRoutesShouldReturnTheVerb()
        {
            RouteMetadata metadata =
                this.service.GetRoutes(typeof(IHasRoutes))
                .Where(rm => rm.Method.Name == nameof(IHasRoutes.DeleteMethod))
                .Single();

            Assert.That(metadata.Verb, Is.EqualTo("DELETE").IgnoreCase);
        }
Example #2
0
        public void InitializeShouldSetTheRouteMetadataFactory()
        {
            var metadata = new RouteMetadata
            {
                Method   = typeof(IFakeRoute).GetMethod(nameof(IFakeRoute.Route)),
                RouteUrl = "route",
                Verb     = "GET"
            };

            this.bootstrapper.DiscoveryService.GetDiscoveredTypes().Returns(new[] { typeof(IFakeRoute) });
            this.bootstrapper.DiscoveryService.GetRoutes(typeof(IFakeRoute)).Returns(new[] { metadata });

            this.bootstrapper.Initialize();

            Assert.That(metadata.Factory, Is.Not.Null);
        }
Example #3
0
        private RouterEntry ToRouterEntry(PluginMetadata plugin, RouteMetadata metadata)
        {
            RouteTargetType targetType;
            string          target;

            if (RouteHandlerFactory.IsRpc(metadata))
            {
                targetType = RouteTargetType.Lambda;
                target     = _namingConventions.GetLambdaName(plugin);
            }
            else
            {
                targetType = RouteTargetType.Sqs;
                target     = _namingConventions.GetSqsName(plugin);
            }

            return(new RouterEntry(plugin.ServiceKey, metadata.Route, targetType, target));
        }
Example #4
0
 public Route()
 {
     Metadata    = new RouteMetadata();
     Coordinates = new List <Coordinate>();
 }
        private void ImplementRouteHandler(MethodDefinition method, FieldDefinition serviceField, RouteMetadata route, bool isRpc)
        {
            var parameters = route.Method.GetParameters();

            // (Message) (T) (Message, CancellationToken) (T, CancellationToken)

            if (parameters.Length != 1 && parameters.Length != 2)
            {
                throw new NotImplementedException();
            }

            var il = method.Body.GetILProcessor();

            var messageParam         = parameters[0];
            var hasCancellationToken = parameters.Length == 2;

            if (messageParam.ParameterType == typeof(Message))
            {
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, serviceField);
                il.Emit(OpCodes.Ldarg_1);
                if (hasCancellationToken)
                {
                    il.Emit(OpCodes.Ldarg_2);
                }
                il.Emit(route.Method.IsVirtual ? OpCodes.Callvirt : OpCodes.Call, _module.ImportReference(route.Method));
            }
            else
            {
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg_1);

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, serviceField);
                il.Emit(OpCodes.Ldftn, _module.ImportReference(route.Method));
                il.Emit(OpCodes.Newobj, _module.ImportReference(GetFuncConstructor(_module.ImportReference(route.Method.ReturnType), _module.ImportReference(messageParam.ParameterType))));

                var jsonHandlerMethod = new GenericInstanceMethod(serviceField.DeclaringType.BaseType.Resolve().Methods.Single(x => x.Name == (isRpc ? "JsonRpcHandler" : "JsonBusHandler")));
                jsonHandlerMethod.GenericArguments.Add(_module.ImportReference(messageParam.ParameterType));
                if (isRpc)
                {
                    jsonHandlerMethod.GenericArguments.Add(_module.ImportReference(route.Method.ReturnType.GetGenericArguments()[0]));
                }
                il.Emit(OpCodes.Call, jsonHandlerMethod);
            }

            il.Emit(OpCodes.Ret);
        }
        private void ImplementRegisterRoute(ILProcessor il, TypeDefinition functionType, FieldDefinition serviceField, VariableDefinition modelVariable, PluginMetadata service, RouteMetadata route)
        {
            var key   = $"Handle_{serviceField.Name}_{route.Method.Name}";
            var isRpc = RouteHandlerFactory.IsRpc(route);

            // create private handler function
            var method = functionType.Methods.SingleOrDefault(x => x.Name == key);

            if (method == null)
            {
                var returnType = _module.ImportReference(isRpc ? _rpcReturnType : _busReturnType);
                method = new MethodDefinition(key, MethodAttributes.Private | MethodAttributes.HideBySig, returnType);
                method.Parameters.Add(new ParameterDefinition("message", ParameterAttributes.None, _messageType));
                method.Parameters.Add(new ParameterDefinition("cancellationToken", ParameterAttributes.None, _cancellationTokenType));
                functionType.Methods.Add(method);

                ImplementRouteHandler(method, serviceField, route, isRpc);
            }

            il.Emit(OpCodes.Ldloc, modelVariable);

            // RoutePatternParser.Parse("...")
            il.Emit(OpCodes.Ldstr, RouterPatternParser.UnParse(route.Route));
            var routePatternParserType = _routingModule.GetType("Toxon.Micro.RabbitBlog.Routing.Patterns.RouterPatternParser").Resolve();
            var patternParse           = _module.ImportReference(routePatternParserType.Methods.Single(x => x.Name == "Parse"));

            il.Emit(OpCodes.Call, patternParse);

            // new Func<...>(method)
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldftn, method);
            il.Emit(OpCodes.Newobj, _module.ImportReference(isRpc ? _rpcFuncConstructor : _busFuncConstructor));

            // ...
            il.Emit(OpCodes.Ldc_I4, (int)(isRpc ? RouteExecution.Synchronous : RouteExecution.Asynchronous));
            il.Emit(OpCodes.Ldc_I4, (int)(isRpc ? RouteMode.Capture : RouteMode.Observe));
            var cancellationTokenNone = _module.ImportReference(_cancellationTokenType.Resolve().Properties.Single(x => x.Name == "None").GetMethod);

            il.Emit(OpCodes.Call, cancellationTokenNone);

            // model.RegisterAsync(...)
            var registerMethod = _module.ImportReference(isRpc ? _rpcRegisterMethod : _busRegisterMethod);

            il.Emit(OpCodes.Callvirt, registerMethod);
        }
Example #7
0
 public Route()
 {
     Metadata = new RouteMetadata();
     Coordinates = new List<Coordinate>();
 }
Example #8
0
 public Route()
 {
     Metadata  = new RouteMetadata();
     Waypoints = new List <Waypoint>();
 }
 public static ICollection<HttpMethod> GetHttpMethods(RouteMetadata metadata)
 {
     HashSet<HttpMethod> allowedMethods;
     return httpMethods.TryGetValue(metadata, out allowedMethods) ? allowedMethods : new HashSet<HttpMethod>();
 }