예제 #1
0
 private static async Task ReplyDocument(HttpContext http, string html, HttpStatusCode code)
 {
     MiddlewareCommon.SetStatusCode(http, code);
     MiddlewareCommon.AddHeaderTextHtml(http);
     MiddlewareCommon.AddHeaderPreventCaching(http);
     await MiddlewareCommon.WriteUtf8Buffer(http, html);
 }
예제 #2
0
 // ReSharper disable once UnusedMethodReturnValue.Local
 private bool TryGetDocument(HttpContext http, [NotNullWhen(true)] out Document?document)
 {
     document = default;
     return(MiddlewareCommon.TryGetParameter(http.Request.Query, "doc", out var text) &&
            Guid.TryParseExact(text, GlobalConstants.GuidFormat, out var documentId) &&
            MiddlewareCommon.TryFindConnection(_app, http, out var connection) &&
            connection.TryGetDocument(documentId, out document));
 }
예제 #3
0
        private async Task SendLibrary(HttpContext http)
        {
#if DEBUG
            MiddlewareCommon.AddHeaderPreventCaching(http);
#else
            MiddlewareCommon.AddHeaderNeverExpires(http);
#endif
            MiddlewareCommon.AddHeaderJSON(http);
            await MiddlewareCommon.WriteBuffer(http, _library);
        }
예제 #4
0
        public bool TryGetSession([NotNullWhen(true)] out Session?session)
        {
            if (MiddlewareCommon.TryFindConnection(Application, Http, out var connection))
            {
                session = connection.Session;
                return(true);
            }

            session = default;
            return(false);
        }
예제 #5
0
 private static async Task ReplyStatusCodeError(Application app, HttpContext http, StatusCodeException status, LaraOptions options)
 {
     if (app.ErrorPages.TryGetPage(status.StatusCode, out var page))
     {
         await page.Run(app, http, options);
     }
     else
     {
         await MiddlewareCommon.SendStatusReply(http, status.StatusCode, status.Message);
     }
 }
예제 #6
0
 public async Task Invoke(HttpContext http)
 {
     try
     {
         await TryInvoke(http);
     }
     catch (StatusCodeException e)
     {
         var text = $"HTTP error {(int)e.StatusCode} '{e.StatusCode}': {e.Message}";
         await MiddlewareCommon.SendStatusReply(http, e.StatusCode, text);
     }
 }
예제 #7
0
        internal static async Task <Task> RunEventHandler(PostEventContext post)
        {
            if (!await MiddlewareCommon.RunHandler(post.Http,
                                                   () => NotifyEventHandler(post)))
            {
                return(Task.CompletedTask);
            }
            var document = post.GetDocument();
            var queue    = document.FlushQueue();

            return(await SendReply(post, queue));
        }
예제 #8
0
        internal static Connection GetConnection(Application app, HttpContext http)
        {
            Connection connection = null;

            MiddlewareCommon.TryFindConnection(app, http, out connection);

            if (connection == null)
            {
                connection = CreateConnection(app, http);
            }

            return(connection);
        }
예제 #9
0
        /// <summary>
        /// Invokes this middleware
        /// </summary>
        /// <param name="context">The HttpContext</param>
        /// <returns>Task</returns>
        public Task Invoke(HttpContext context)
        {
            context = context ?? throw new ArgumentNullException(nameof(context));
            var remote = context.Connection.RemoteIpAddress;

            if (IPAddress.IsLoopback(remote))
            {
                return(_next.Invoke(context));
            }
            var msg = $"Forbidden request from {remote}";

            _logger.LogInformation(msg);
            return(MiddlewareCommon.SendStatusReply(context, HttpStatusCode.Forbidden, Resources.Http403));
        }
예제 #10
0
 private static async Task ProcessRequest(PostEventContext context)
 {
     if (MiddlewareCommon.TryFindConnection(context.Application, context.Http, out var connection) &&
         context.Parameters != null &&
         connection.TryGetDocument(context.Parameters.DocumentId, out var document))
     {
         context.Connection = connection;
         context.Document   = document;
         await ProcessRequestDocument(context);
     }
     else
     {
         await SendEvent(context, EventResultType.NoSession);
     }
 }
예제 #11
0
        public static bool TryParse(IQueryCollection query, [NotNullWhen(true)] out DiscardParameters?parameters)
        {
            if (MiddlewareCommon.TryGetParameter(query, "doc", out var documentText) &&
                Guid.TryParseExact(documentText, GlobalConstants.GuidFormat, out var documentId))
            {
                parameters = new DiscardParameters
                {
                    DocumentId = documentId,
                };
                return(true);
            }

            parameters = default;
            return(false);
        }
예제 #12
0
        internal override async Task <bool> ProcessRequest(HttpContext http)
        {
            if (http.Request.Method != "POST" || http.Request.Path != "/_discard" ||
                !DiscardParameters.TryParse(http, out var parameters) ||
                !MiddlewareCommon.TryFindConnection(_app, http, out var connection))
            {
                return(false);
            }
            await Task.Delay(DiscardDelay);

            await connection.Discard(parameters.DocumentId);

            await _app.ClearEmptyConnection(connection);

            return(true);
        }
예제 #13
0
        internal static async Task ProcessAjaxRequest(Application app, HttpContext http)
        {
            if (EventParameters.TryParse(http.Request.Query, out var parameters))
            {
                await parameters.ReadAjaxMessage(http);

                var post = new PostEventContext(app, http)
                {
                    Parameters = parameters
                };
                await ProcessRequest(post);
            }
            else
            {
                await MiddlewareCommon.SendStatusReply(http, HttpStatusCode.BadRequest, Resources.BadRequest);
            }
        }
예제 #14
0
        public async Task Run(Application app, HttpContext http, LaraOptions options)
        {
            var context = new WebServiceContext(app, http)
            {
                RequestBody = await MiddlewareCommon.ReadBody(http).ConfigureAwait(false)
            };
            var handler = Factory();
            var data    = Array.Empty <byte>();

            if (await MiddlewareCommon.RunHandler(http, async() =>
            {
                data = await handler.Execute();
            }).ConfigureAwait(false))
            {
                await SendReply(context, data);
            }
        }
예제 #15
0
        public static bool TryParse(IQueryCollection query, [NotNullWhen(true)] out EventParameters?parameters)
        {
            if (MiddlewareCommon.TryGetParameter(query, "doc", out var documentText) &&
                MiddlewareCommon.TryGetParameter(query, "el", out var elementId) &&
                MiddlewareCommon.TryGetParameter(query, "ev", out var eventName) &&
                MiddlewareCommon.TryGetParameter(query, "seq", out var sequence) &&
                long.TryParse(sequence, NumberStyles.Any, CultureInfo.InvariantCulture, out var eventNumber) &&
                Guid.TryParseExact(documentText, GlobalConstants.GuidFormat, out var documentId))
            {
                parameters = new EventParameters
                {
                    DocumentId  = documentId,
                    ElementId   = elementId,
                    EventName   = eventName,
                    EventNumber = eventNumber
                };
                return(true);
            }

            parameters = default;
            return(false);
        }
예제 #16
0
        private static async Task ProcessWebSocketEvent(Application app, HttpContext http)
        {
            var socket = await http.WebSockets.AcceptWebSocketAsync();

            var result = await MiddlewareCommon.ReadWebSocketMessage <SocketEventParameters>(socket, MaxSizeBytes);

            var context = new PostEventContext(app, http)
            {
                Http       = http,
                Socket     = socket,
                Parameters = result.Item2
            };

            if (result.Item1)
            {
                await ProcessRequest(context);
            }
            else
            {
                await context.Socket.CloseAsync(WebSocketCloseStatus.InvalidPayloadData,
                                                "Bad request", CancellationToken.None);
            }
        }
예제 #17
0
 internal static Connection GetConnection(Application app, HttpContext http)
 {
     return(MiddlewareCommon.TryFindConnection(app, http, out var connection) ? connection : CreateConnection(app, http));
 }
예제 #18
0
 private static async Task SendAjaxReply(HttpContext http, string json)
 {
     MiddlewareCommon.AddHeaderJSON(http);
     await MiddlewareCommon.WriteUtf8Buffer(http, json);
 }
예제 #19
0
 private async Task SendReply(WebServiceContext context, byte[] data)
 {
     WebServicePublished.SendHeader(context, ContentType);
     await MiddlewareCommon.WriteBuffer(context.Http, data);
 }
예제 #20
0
 private async Task SendReply(WebServiceContext context, string data)
 {
     SendHeader(context, ContentType);
     await MiddlewareCommon.WriteUtf8Buffer(context.Http, data);
 }