Beispiel #1
0
    public async Task Invoke(HttpContext context)
    {
        if (!IsEventPost(context))
        {
            await _next(context);

            return;
        }

        if (_appOptions.EventSubmissionDisabled)
        {
            context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable;
            return;
        }

        string organizationId   = context.Request.GetDefaultOrganizationId();
        var    organizationTask = _organizationRepository.GetByIdAsync(organizationId, o => o.Cache());

        string projectId   = context.Request.GetDefaultProjectId();
        var    projectTask = _projectRepository.GetByIdAsync(projectId, o => o.Cache());

        bool tooBig = false;

        if (String.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase) && context.Request.Headers != null)
        {
            if (context.Request.Headers.ContentLength.HasValue && context.Request.Headers.ContentLength.Value <= 0)
            {
                //_metricsClient.Counter(MetricNames.PostsBlocked);
                context.Response.StatusCode = StatusCodes.Status411LengthRequired;
                await Task.WhenAll(organizationTask, projectTask);

                return;
            }

            long size = context.Request.Headers.ContentLength.GetValueOrDefault();
            if (size > 0)
            {
                _metricsClient.Gauge(MetricNames.PostsSize, size);
            }

            if (size > _appOptions.MaximumEventPostSize)
            {
                if (_logger.IsEnabled(LogLevel.Warning))
                {
                    using (_logger.BeginScope(new ExceptionlessState().Value(size).Tag(context.Request.Headers.TryGetAndReturn(Headers.ContentEncoding))))
                        _logger.SubmissionTooLarge(size);
                }

                _metricsClient.Counter(MetricNames.PostsDiscarded);
                tooBig = true;
            }
        }

        var organization = await organizationTask;
        var project      = await projectTask;

        // block large submissions, client should break them up or remove some of the data.
        if (tooBig)
        {
            await _usageService.IncrementTooBigAsync(organization, project).AnyContext();

            context.Response.StatusCode = StatusCodes.Status413RequestEntityTooLarge;
            return;
        }

        bool overLimit = await _usageService.IsOverLimitAsync(organization).AnyContext();

        if (overLimit)
        {
            _metricsClient.Counter(MetricNames.PostsBlocked);
            context.Response.StatusCode = StatusCodes.Status402PaymentRequired;
            return;
        }

        context.Request.SetOrganization(organization);
        context.Request.SetProject(project);
        await _next(context);
    }