Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 internal Body (Body parent, int maxBoundaryLength)
 {
     Parent = parent;
     _completed = false;
     _maxBoundaryLength = maxBoundaryLength;
 }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 5
0
 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;
 }
Ejemplo n.º 6
0
        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;
            }
        }