Exemple #1
0
        /// <summary>
        /// Process and log the request and associated data
        /// </summary>
        private async Task ProcessRequestDataAsync(DataRequestType requestType = DataRequestType.Log)
        {
            Guid?sessionIdentifier = null;  // Null means it will be automatically created
            // A cross-domain SID can be specified
            var sentSessId = (string)Request.Form.sid;

            // TODO: Maybe validation to ensure SID is not being overwritten
            if (sentSessId != null)
            {
                if (Guid.TryParse(sentSessId, out Guid resultSessGuid))
                {
                    // TODO: Possibly note that session used custom ID
                    sessionIdentifier = resultSessGuid;
                }
            }

            var sessionInfo = await CreateOrRetrieveSessionAsync(sessionIdentifier);

            var currentSession = sessionInfo.Item1;
            var newSession     = sessionInfo.Item2;

            var eventIdentifier = Guid.NewGuid();

            if (requestType.HasFlag(DataRequestType.Log))
            {
                var req = new LogRequest
                {
                    Identifier        = eventIdentifier,
                    SessionIdentifier = currentSession.SessionId,
                    Timestamp         = DateTime.Now,
                    RequestType       = requestType
                };
                // Get client address
                var clientAddr = GetClientAddress();
                req.OriginAddress = clientAddr;
                req.KQApiNode     = Request.Url;
                if (requestType.HasFlag(DataRequestType.Hit))
                {
                    // Map to Hit request
                    var hitReq = Mapper.Map <HitRequest>(req);
                    // Check if also a web request
                    if (requestType.HasFlag(DataRequestType.Web))
                    {
                        hitReq.Referrer = Request.Headers.Referrer;
                        // Attempt to get page URL
                        hitReq.PageIdentifier =
                            (string)Request.Query.u      // Query string
                            ?? (string)Request.Form.u    // Form data
                            ?? Request.Headers.Referrer; // Referrer
                                                         // Check if FetchScript
                        if (requestType.HasFlag(DataRequestType.FetchScript))
                        {
                            // Map to FetchScriptRequest
                            var fetchScriptReq = Mapper.Map <FetchScriptRequest>(hitReq);
                            hitReq = fetchScriptReq;
                        }
                    }
                    req = hitReq;
                }
                // Tag is not compatible with Hit
                else if (requestType.HasFlag(DataRequestType.Tag))
                {
                    // Log with custom data
                    var tagReq = Mapper.Map <TagRequest>(req);
                    tagReq.Tag       = Request.Form.tag;
                    tagReq.ExtraData = Request.Form.data;
                    req = tagReq;
                }
                // Redirect is not compatible with Tag or Hit
                else if (requestType.HasFlag(DataRequestType.Redirect))
                {
                    // TODO: Log redirect
                    var redirReq = Mapper.Map <RedirectRequest>(req);
                    // This flag IMPLIES the Web flag
                    if (requestType.HasFlag(DataRequestType.Web))
                    {
                        // Get target URL and save
                        redirReq.DestinationUrl = Request.Query.t;
                    }
                    req = redirReq;
                }
                var dataLoggerService = new DataLoggerService(ServerContext);
                // Save data using Logger service, on the thread pool
                var saveDataTask = Task.Factory.StartNew(async() =>
                {
                    await dataLoggerService.SaveLogRequestAsync(req);
                });
                // Custom saving
                if (req is TagRequest)
                {
                    var saveTagTask = Task.Factory.StartNew(async() =>
                    {
                        await dataLoggerService.SaveTagRequestAsync((TagRequest)req);
                    });
                }
            }
        }