/// <summary> /// Parse charset. /// </summary> /// <param name="headers"></param> /// <returns></returns> private string ParseCharSet(string headers) { string charset = MimeParser.ParseHeaderFiledSubField("Content-Type:", "charset", headers); // charset ends with ; remove it. Is it right place to do or can it be done MimeParser.ParseHeaderFiledSubField if (charset.EndsWith(";")) { charset = charset.Substring(0, charset.Length - 1); } if (charset.Length > 0) { try{ Encoding.GetEncoding(charset); return(charset); } catch { return("ascii"); } } // If no charset, consider it as ascii else { return("ascii"); } }
/// <summary> /// Default constructor. /// </summary> /// <param name="mimeEntry"></param> /// <param name="mime"></param> public MimeEntry(byte[] mimeEntry, MimeParser mime) { MemoryStream entryStrm = new MemoryStream(mimeEntry); m_Headers = MimeParser.ParseHeaders(entryStrm); m_ContentType = mime.ParseContentType(m_Headers); m_Entries = new ArrayList(); // != multipart content if (m_ContentType.ToLower().IndexOf("multipart") == -1) { m_CharSet = ParseCharSet(m_Headers); m_ContentEncoding = ParseEncoding(m_Headers); m_Data = new byte[entryStrm.Length - entryStrm.Position]; entryStrm.Read(m_Data, 0, m_Data.Length); } // multipart content, get nested entries else { long s = (int)entryStrm.Position; string boundaryID = MimeParser.ParseHeaderFiledSubField("Content-Type:", "boundary", m_Headers); m_Entries = mime.ParseEntries(entryStrm, (int)entryStrm.Position, boundaryID); entryStrm.Position = s; m_Data = new byte[entryStrm.Length - s]; entryStrm.Read(m_Data, 0, m_Data.Length); } }