public async Task InvokeAsync(
            HttpContext context,
            AspNetCoreTracker tracker,
            IOptions <GoogleAnalyticsTrackerOptions> optionsAccessor)
        {
            await _next(context);

            if (optionsAccessor.Value.ShouldTrackRequestInMiddleware == null ||
                optionsAccessor.Value.ShouldTrackRequestInMiddleware(context))
            {
                await tracker.TrackPageViewAsync();

                context.Items[TrackPageViewHandledMarker] = true;
            }
        }
        public static async Task <TrackingResult> TrackPageViewAsync(this AspNetCoreTracker tracker, HttpContext httpContext, string pageTitle, string pageUrl = null)
        {
            pageUrl ??= httpContext.Request.Path;

            var pageViewParameters = new PageView
            {
                DocumentTitle       = pageTitle,
                DocumentLocationUrl = pageUrl,
                UserAgent           = httpContext.Request.Headers[HeaderNames.UserAgent].ToString(),
                DocumentHostName    = httpContext.Request.Host.Value,
                UserLanguage        = httpContext.Request.Headers[HeaderNames.AcceptLanguage].ToString().ToLower(),
                IpOverride          = httpContext.Connection.RemoteIpAddress.ToString()
            };

            return(await tracker.TrackAsync(pageViewParameters));
        }
        public static async Task <TrackingResult> TrackUserTimingAsync(this AspNetCoreTracker tracker, HttpContext httpContext, string pageTitle, string pageUrl, string category, string var, long value, string label = null)
        {
            var userTimingParameters = new UserTimings
            {
                DocumentTitle       = pageTitle,
                DocumentLocationUrl = pageUrl,
                UserAgent           = httpContext.Request.Headers[HeaderNames.UserAgent].ToString(),
                DocumentHostName    = httpContext.Request.Host.Value,
                UserLanguage        = httpContext.Request.Headers[HeaderNames.AcceptLanguage].ToString().ToLower(),
                UserTimingCategory  = category,
                UserTimingVariable  = var,
                UserTimingTime      = value,
                UserTimingLabel     = label
            };

            return(await tracker.TrackAsync(userTimingParameters));
        }