Exemplo n.º 1
0
        protected override async Task <string> HandleRequest(HttpListenerRequest request, HttpListenerResponse response, string defaultMessage)
        {
            string command = request.GetHeaderValue(Headers.Command, "Wrong request to service, command is not specified");

            bool forService = request.GetHeaderValue <bool>(Headers.CommandTarget, "Wrong request to service, command target is not specified");

            if (forService)
            {
                switch (command)
                {
                case ServiceCommands.Stop:
                {
                    Stop();
                    break;
                }

                case ServiceCommands.Info:
                {
                    var builder = new StringBuilder();
                    Dictionary <long, Task <HttpResponseMessage> > handlerInfoTasks;

                    lock (_wrappersLock)
                    {
                        RefreshWrappers();

                        builder.Append($"\nTotal active handlers: {_wrappers.Count}\n");

                        handlerInfoTasks = _wrappers
                                           .Values
                                           .Where(x => x.IsRunning)
                                           .ToDictionary(x => x.ID, x => _client.SendMessageAsync(x.Port, true, null, (Headers.Command, HandlerCommands.Info)));
                    }

                    try
                    {
                        await Task.WhenAll(handlerInfoTasks.Values);
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Exception while gathering info from handlers: {0}", ex);
                    }

                    foreach ((long key, var task) in handlerInfoTasks.OrderBy(x => x.Key))
                    {
                        builder.Append($"\nHandler[{key}]:\n");

                        try
                        {
                            string message = await(await task).GetMessageAsync();

                            builder.Append($"{message}");
                        }
                        catch (Exception ex)
                        {
                            builder.Append($"Request failed with exception: {ex}");
                        }
                    }

                    return(builder.ToString());
                }

                case ServiceCommands.RunHandler:
                {
                    var options = await request.GetContentAsync <HandlerOptions>();

                    return(await RunHandlerAsync(options));
                }

                default:
                {
                    throw new Exception($"Service cannot handle command: {command}");
                }
                }
            }
            else
            {
                long handlerID = request.GetHeaderValue <long>(Headers.HandlerID, "Handler ID is not specified");

                if (!TryGetWrapper(handlerID, out var wrapper))
                {
                    throw new Exception($"No handler for ID = {handlerID}");
                }

                if (!wrapper.IsRunning)
                {
                    throw new Exception("Handler is closing and cannot accept requests");
                }

                string content = await request.GetContentAsync();

                var handlerResponse = await _client.SendMessageAsync(wrapper.Port, false, content, (Headers.Command, command));

                string message = await handlerResponse.GetMessageAsync();

                if (handlerResponse.IsSuccessStatusCode)
                {
                    return(message);
                }

                throw new Exception(message);
            }

            return(defaultMessage);
        }
Exemplo n.º 2
0
        protected override async Task <string> HandleRequest(HttpListenerRequest request, HttpListenerResponse response, string defaultMessage)
        {
            string command = request.GetHeaderValue(Headers.Command, "Wrong request to handler, command is not specified");

            switch (command)
            {
            case HandlerCommands.InitInfo:
            {
                await InitTask;

                break;
            }

            case HandlerCommands.Stop:
            {
                string[] args = await request.GetContentAsync <string[]>();

                if (args != null)
                {
                    _handlerOptions.DisposeArgs = args;
                }

                Stop();

                break;
            }

            case HandlerCommands.StopTrigger:
            {
                long triggerID = await request.GetContentAsync <long>();

                _scheduler.Remove(triggerID);

                break;
            }

            case HandlerCommands.Handle:
            {
                var info = await request.GetContentAsync <CommandInfo>();

                (string value, bool returns) = await _handler.Handle(info.Command, info.Args);

                if (returns)
                {
                    return(value);
                }

                break;
            }

            case HandlerCommands.ExtendSchedule:
            {
                var options = await request.GetContentAsync <TriggersOptions>();

                _scheduler.AddRange(options.All);

                return(_scheduler.GetStat());
            }

            case HandlerCommands.Info:
            {
                return(_scheduler.GetStat());
            }

            case HandlerCommands.GetLog:
            {
                using (var reader = new StreamReader(_processArgs.Log))
                {
                    return(await reader.ReadToEndAsync());
                }
            }

            default:
            {
                throw new Exception($"Handler cannot handle command: {command}");
            }
            }

            return(defaultMessage);
        }