protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (!IsEventPost(request)) return await base.SendAsync(request, cancellationToken); if (Settings.Current.EventSubmissionDisabled) return CreateResponse(request, HttpStatusCode.ServiceUnavailable, "Service Unavailable"); bool tooBig = false; if (request.Content?.Headers != null) { long size = request.Content.Headers.ContentLength.GetValueOrDefault(); await _metricsClient.GaugeAsync(MetricNames.PostsSize, size); if (size > Settings.Current.MaximumEventPostSize) { Log.Warn().Message("Event submission discarded for being too large: {0}", size).Project(request.GetDefaultProjectId()).Write(); await _metricsClient.CounterAsync(MetricNames.PostsDiscarded); tooBig = true; } } bool overLimit = await _organizationRepository.IncrementUsageAsync(request.GetDefaultOrganizationId(), tooBig); // block large submissions, client should break them up or remove some of the data. if (tooBig) return CreateResponse(request, HttpStatusCode.RequestEntityTooLarge, "Event submission discarded for being too large."); if (overLimit) { await _metricsClient.CounterAsync(MetricNames.PostsBlocked); return CreateResponse(request, HttpStatusCode.PaymentRequired, "Event limit exceeded."); } return await base.SendAsync(request, cancellationToken); }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (!IsEventPost(request)) return base.SendAsync(request, cancellationToken); string organizationId = request.GetDefaultOrganizationId(); if (String.IsNullOrEmpty(organizationId)) return CreateResponse(request, HttpStatusCode.Unauthorized, "Unauthorized"); bool overLimit = _organizationRepository.IncrementUsage(organizationId); return overLimit ? CreateResponse(request, HttpStatusCode.PaymentRequired, "Event limit exceeded.") : base.SendAsync(request, cancellationToken); }
protected virtual string GetUserIdentifier(HttpRequestMessage request) { var authType = request.GetAuthType(); if (authType == AuthType.Token) return request.GetDefaultOrganizationId(); if (authType == AuthType.User) { var user = request.GetUser(); if (user != null) return user.Id; } // fallback to using the IP address var ip = request.GetClientIpAddress(); if (String.IsNullOrEmpty(ip) || ip == "::1") ip = "127.0.0.1"; return ip; }