IEnumerable <ScanResult> ScanStream(Contracts.Enums.FileType fileType, bool scanOverlaps) { streamLength = 0L; using (var stream = InitiateStream(fileType)) { int read; do { read = stream.Read(buffer, blockSize); var scanResult = client.ScanBuffer( buffer , (uint)blockSize , $"{filePath}@{stream.Position}>{stream.CurrentEntryName}"); yield return(scanResult); } while (read > 0); streamLength = stream.Position; } if (scanOverlaps && fileInfo.Length > blockSize) { using (var stream = InitiateStream(fileType)) foreach (var overlap in GetOverlaps(streamLength)) { yield return(ScanSegment(stream, overlap)); } } }
bool TryScan(Contracts.Enums.FileType fileType, bool scanOverlaps, out ScanResult lastResult, out ScanResult breakingResult) { ScanResult anyResult = null; try { breakingResult = ScanStream(fileType, scanOverlaps) .FirstOrDefault(segmentResult => ResultBuilder.IsBreakResult((anyResult = segmentResult).Result)); } catch (AMSIRejectedByPolicyException e) { breakingResult = new ScanResult() { IsSafe = false, Result = DetectionResult.FileRejected, ResultDetail = e.Message }; } catch (Exception e) { breakingResult = new ScanResult() { IsSafe = false, Result = DetectionResult.ApplicationError, ResultDetail = e.ToString() }; } if (anyResult != null) { anyResult.ContentInfo.ContentByteSize = streamLength; anyResult.ContentInfo.ContentHash = md5Hash.GetAwaiter().GetResult(); anyResult.ContentInfo.ContentName = filePath; anyResult.ContentInfo.ContentType = ContentType.File; anyResult.ContentInfo.ContentFileType = ConvertFileType(fileSignature.FileType); } lastResult = anyResult; return(breakingResult == null); }
internal IInputStream InitiateStream(Contracts.Enums.FileType fileType) => InputStreamsFunc[fileType]();