private static AnalyzerOutput AnalyzeInternal( TransactionInfo transaction, DescriptiveItem<AnalysisType> analysisType, ScoreUtilityType? scoreUtilityType, PageSpeedStrategy? pageSpeedStrategy) { using (var tempFileCollection = new TempFileCollection(Path.GetTempPath(), false)) { var fileName = Path.ChangeExtension(Path.GetRandomFileName(), ".har"); var inputFilePath = Path.Combine(Path.GetTempPath(), fileName); tempFileCollection.AddFile(inputFilePath, false); var outputFilePath = inputFilePath + ".json"; tempFileCollection.AddFile(outputFilePath, false); using (var stream = File.Create(inputFilePath)) { transaction.HarRoot.Serialize(stream); } var analysisResult = AnalyzeHar( analysisType, scoreUtilityType, pageSpeedStrategy, inputFilePath, outputFilePath); return new AnalyzerOutput(transaction, analysisType, analysisResult); } }
private void CommitTransactionIfPending() { if (_transactionInfo == null) { return; } var harLog = _transactionInfo.HarRoot.EnsureNotNull().Log.EnsureNotNull(); _harEntries.DoForEach(entry => entry.ComputeTime()); harLog.Pages = _harPages.EnsureNotNull().ToArray(); harLog.Entries = _harEntries.EnsureNotNull().ToArray(); _transactionInfos.Add(_transactionInfo); _transactionInfo = null; _harPages = null; _harEntries = null; _internalIdToHarEntryMap = null; _urlToOpenRequestHarEntryMap = null; _socketIdToDataMap = null; }
private void ParseInternal() { _transactionInfos = new List <TransactionInfo>(); _transactionInfo = null; _pageUniqueId = 0; _implicitTransactionUniqueId = 0; _harPages = null; _harEntries = null; _internalIdToHarEntryMap = null; _harPage = null; _line = null; _lineIndex = 0; _skipFetchOnce = false; _scriptStartTime = null; while (FetchLine()) { var utcStartTimeMatch = _line.MatchAgainst(ParsingHelper.UtcStartTimeRegex); if (utcStartTimeMatch.Success) { if (_scriptStartTime.HasValue) { throw new InvalidOperationException(@"The script's start date/time was already found."); } var year = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateYearGroupName).ParseInt(); var month = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateMonthGroupName).ParseInt(); var day = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateDayGroupName).ParseInt(); var hour = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateHourGroupName).ParseInt(); var minute = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateMinuteGroupName).ParseInt(); var second = utcStartTimeMatch.GetSucceededGroupValue(ParsingHelper.DateSecondGroupName).ParseInt(); _scriptStartTime = new DateTimeOffset(year, month, day, hour, minute, second, TimeSpan.Zero); continue; } var transactionEndMatch = _line.MatchAgainst(ParsingHelper.TransactionEndRegex); if (transactionEndMatch.Success) { CommitTransactionIfPending(); continue; } var transactionStartMatch = _line.MatchAgainst(ParsingHelper.TransactionStartRegex); if (transactionStartMatch.Success) { CommitTransactionIfPending(); var name = transactionStartMatch.GetSucceededGroupValue(ParsingHelper.NameGroupName); _transactionInfo = CreateTransaction(name); continue; } var connectedSocketMatch = _line.MatchAgainst(ParsingHelper.ConnectedSocketRegex); if (connectedSocketMatch.Success) { var socketId = connectedSocketMatch.GetSucceededGroupValue(ParsingHelper.SocketIdGroupName).ParseInt(); var sourceEndpoint = connectedSocketMatch .GetSucceededGroupValue(ParsingHelper.SourceEndpointGroupName) .ParseEndPoint(); var targetEndpoint = connectedSocketMatch .GetSucceededGroupValue(ParsingHelper.TargetEndpointGroupName) .ParseEndPoint(); var connectTimeInMilliseconds = connectedSocketMatch.GetSucceededGroupValue(ParsingHelper.DurationGroupName).ParseLong(); var socketData = new SocketData { SourceEndpoint = sourceEndpoint, TargetEndpoint = targetEndpoint }; EnsureTransactionInfo(); _socketIdToDataMap.EnsureNotNull().Add(socketId, socketData); FetchRequestHeaders(connectTimeInMilliseconds, sourceEndpoint, targetEndpoint); continue; } var alreadyConnectedMatch = _line.MatchAgainst(ParsingHelper.AlreadyConnectedRegex); if (alreadyConnectedMatch.Success) { var socketId = alreadyConnectedMatch.GetSucceededGroupValue(ParsingHelper.SocketIdGroupName).ParseInt(); EnsureTransactionInfo(); var socketData = _socketIdToDataMap.EnsureNotNull().GetValueOrDefault(socketId); if (socketData == null) { throw new InvalidOperationException( $"Socket data for the already connected socket {socketId} was not found."); } FetchRequestHeaders(0, socketData.SourceEndpoint, socketData.TargetEndpoint); continue; } var responseHeadersMarkerMatch = _line.MatchAgainst(ParsingHelper.ResponseHeadersMarkerRegex); if (responseHeadersMarkerMatch.Success) { ProcessResponseHeaders(responseHeadersMarkerMatch); continue; } var encodedResponseBodyReceivedMatch = _line.MatchAgainst(ParsingHelper.EncodedResponseBodyReceivedRegex); if (encodedResponseBodyReceivedMatch.Success) { ProcessResponseBody(encodedResponseBodyReceivedMatch); continue; } var responseBodyMarkerRegexMatch = _line.MatchAgainst(ParsingHelper.ResponseBodyMarkerRegex); if (responseBodyMarkerRegexMatch.Success) { ProcessResponseBody(responseBodyMarkerRegexMatch); continue; } //// TODO [vmcl] Parse request body var requestDoneMatch = _line.MatchAgainst(ParsingHelper.RequestDoneRegex); if (requestDoneMatch.Success) { var url = requestDoneMatch.GetSucceededGroupValue(ParsingHelper.UrlGroupName); var harEntry = _urlToOpenRequestHarEntryMap.EnsureNotNull().GetValueOrDefault(url); if (harEntry == null) { throw new InvalidOperationException( $@"Cannot find a corresponding entry for the completed request ""{url}"" (line {_lineIndex })."); } var doneTime = GetTime(requestDoneMatch); var elapsed = doneTime - harEntry.StartedDateTime.EnsureNotNull(); var timings = harEntry.Timings.EnsureNotNull(); timings.Receive = (decimal)elapsed.TotalMilliseconds - timings.Wait.GetValueOrDefault(); continue; } Debug.WriteLine($"[{GetType().GetQualifiedName()}] Skipping line: {_line}"); } }