private async Task ReadMultiPart(BufferedByteReader reader) { if (ContentType.Boundary.Length > _maxBoundaryLength) _maxBoundaryLength = ContentType.Boundary.Length; await ReadToStart(reader); while (!_completed) { var body = new Body(this, _maxBoundaryLength); await body.Header.ReadHeader(reader); await body.ReadBody(reader, Header.ContentTransferEncoding); Bodies.Add(body); } if (!_completed) Complete(); return; }
internal async Task<Body> ReadBody( BufferedByteReader reader) { var body = new Body(); var nextByte = await reader.ReadByteAsync(); { if (nextByte == _boundary[0]) { if (await CheckBytes(reader)) { var bodyPart = new Body(); await bodyPart.Header.ReadHeader(reader); } } nextByte = await reader.ReadByteAsync(); } return body; }
internal Body (Body parent, int maxBoundaryLength) { Parent = parent; _completed = false; _maxBoundaryLength = maxBoundaryLength; }
private bool CheckOneByte(byte oneByte, int index, Body body) { Parent?.CheckOneByte(oneByte, index, this); if (_completed) return true; if (!_boundaryPossible) return false; if (index < ContentType.Boundary.Length) { if (ContentType.Boundary[index] != oneByte) { _boundaryPossible = false; return false; } return true; } if ((index + 1)==ContentType.Boundary.Length) body?.Complete(); return true; }
private async Task<bool> CheckBytes(BufferedByteReader reader, byte newByte, Body body) { if (newByte != _boundaryStart[0]) return false; if ((await reader.ReadByteAhead()) != _boundaryStart[1]) return false; if ((await reader.ReadByteAhead()) != _boundaryStart[2]) return false; if ((await reader.ReadByteAhead()) != _boundaryStart[3]) return false; _boundaryPossible = true; var i = 0; while (!_completed && !NoBoundaryPossible && i < _maxBoundaryLength) { var oneByte = await reader.ReadByteAhead(); CheckOneByte(oneByte, i, this); i += 1; } if return true; }
public async Task<List<Body>> GetBodies(IByteStreamReader streamReader, ContentTypeFieldValue contentType, string transportEncoding) { var reader = new BufferedByteReader(streamReader); switch (contentType.Type) { case "multipart": var bodyPartReader = new BodyReader(ContentType, Header.ContentTransferEncoding); var bodies = await bodyPartReader.ReadBody(reader); break; case "text": var textString = ""; using (var memstream = await streamReader.GetMemoryStreamAsync()) { using (var unEncoded = await MailMethods.UnEncode(memstream, Header.ContentTransferEncoding)) { using (var textReader = new StreamReader(unEncoded, Encoding.GetEncoding(Header.ContentType.Charset))) { textString = await textReader.ReadToEndAsync(); } } } var textBody = new Body(); textBody.Content = (new MemoryStream(Encoding.Unicode.GetBytes(textString))); break; case "image": case "audio": case "video": case "application": var binaryBody = new Body(); binaryBody.Content = await streamReader.GetMemoryStreamAsync()); break; } }