예제 #1
0
        internal async Task HandleAsync(NotificationApiRequest request, string path, HttpMethod method)
        {
            log.Info($"Starting process request {path}");

            var handler = handlerMapper.Get(path, method);

            if (handler != null)
            {
                await handler.HandleAsync(request);

                return;
            }

            request.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
        }
예제 #2
0
        public static string Generate(NotificationApiRequest request)
        {
            var timeBytes = BitConverter.GetBytes(request.timestamp / 60);
            var part1     = BitConverter.ToInt32(new[] { timeBytes[0], timeBytes[1], timeBytes[2], timeBytes[3] });
            var part2     = BitConverter.ToInt16(new[] { timeBytes[4], timeBytes[5] });
            var part3     = BitConverter.ToInt16(new[] { timeBytes[6], timeBytes[7] });
            var srcBytes  = Encoding.UTF8.GetBytes(request.source);
            var bytes     = new byte[8];

            for (var i = 0; i < Math.Min(srcBytes.Length, 8); i++)
            {
                bytes[i] = srcBytes[i];
            }
            var guid = new Guid(part1, part2, part3, bytes);

            return(guid.ToString());
        }
예제 #3
0
        public void Configure(IApplicationBuilder app, IHostingEnvironment env,
                              ILoggerFactory loggerFactory)
        {
            app.Run(async(context) =>
            {
                var b = a.HttpContext;
                string body;
                using (StreamReader reader = new StreamReader(b.Request.Body, Encoding.UTF8, true, 1024, true))
                {
                    body = reader.ReadToEnd();
                }

                var method = string.Equals(b.Request.Method, "GET", StringComparison.OrdinalIgnoreCase) ? HttpMethod.Get : HttpMethod.Post;
                var notificationApiRequest = method == HttpMethod.Post ? NotificationApiRequest.CreateFromBody(body, b) : NotificationApiRequest.CreateFromQueryCollection(b.Request.Query, b);
                await handler.HandleAsync(notificationApiRequest, b.Request.Path, method);
            });
        }
        public async Task HandleAsync(NotificationApiRequest request)
        {
            request.HttpContext.Response.Headers.Add("Content-Type", "text/event-stream");
            request.HttpContext.Response.Headers.Add("Keep-alive", "true");
            request.HttpContext.Response.ContentType = "text/event-stream";

            if (!(await subscriber.Subscribe(request.source, request.Token, request.HttpContext)))
            {
                request.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                return;
            }

            var cts = new TaskCompletionSource <byte>();

            request.HttpContext.RequestAborted.Register(() => cts.TrySetResult(1));
            await cts.Task;

            subscriber.Unsubscribe(request.source, request.HttpContext);
        }
예제 #5
0
        public async Task HandleAsync(NotificationApiRequest request)
        {
            var token = request.IsPublic ? null : TokensGenerator.Generate(request);

            await mongoDbClient.InsertUser(request.source, token, request.password, request.IsPublic);

            if (request.IsPublic)
            {
                authorizer.RegisterPublic(request.source, request.password);
            }
            else
            {
                authorizer.RegisterPrivate(request.source, token, request.password);
            }

            sourceStorage.Add(request.source);
            request.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
            await request.HttpContext.Response.WriteAsync(token);

            await request.HttpContext.Response.Body.FlushAsync();
        }
예제 #6
0
        public async Task HandleAsync(NotificationApiRequest request)
        {
            if (!authorizer.CanPush(request.source, request.password))
            {
                request.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                return;
            }

            request.HttpContext.Response.StatusCode = (int)HttpStatusCode.Accepted;
            Task.Run(async() =>
            {
                if (sourceStorage.TryGetInfo(request.source, out var info))
                {
                    var message = new Message(request.Base64Message, DateTime.UtcNow + ttl);
                    if (info.AddMessage(message))
                    {
                        await mongoClient.InsertMessage(request.source, message);
                        messageSender.Send(request.Base64Message, info);
                    }
                }
            });
        }