Esempio n. 1
0
#pragma warning disable CS8765 // Nullability of parameter 'name' doesn't match overridden member
        public override void Remove(string name)
#pragma warning restore CS8765
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (name.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType = null !; // this throws ArgumentNullException
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition = null;
            }

            base.Remove(name);
        }
Esempio n. 2
0
 internal void Set(string contentDisposition, HeaderCollection headers)
 {
     this.disposition = contentDisposition;
     this.ParseValue();
     headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentDisposition), this.ToString());
     this.isPersisted = true;
 }
        public override void Remove(string name)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Remove", name);
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "name" }), "name");
            }
            MailHeaderID iD = MailHeaderInfo.GetID(name);

            if ((iD == MailHeaderID.ContentType) && (this.part != null))
            {
                this.part.ContentType = null;
            }
            else if ((iD == MailHeaderID.ContentDisposition) && (this.part is MimePart))
            {
                ((MimePart)this.part).ContentDisposition = null;
            }
            base.Remove(name);
        }
Esempio n. 4
0
 internal void Set(string contentType, HeaderCollection headers)
 {
     _type = contentType;
     ParseValue();
     headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentType) !, ToString());
     _isPersisted = true;
 }
Esempio n. 5
0
 internal void Set(string contentType, HeaderCollection headers)
 {
     this.type = contentType;
     this.ParseValue();
     headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentType), this.ToString());
     this.isPersisted = true;
 }
Esempio n. 6
0
        public override void Remove(string name)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Remove", name);
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, "name"), "name");
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && part != null)
            {
                part.ContentType = null;
            }
            else if (id == MailHeaderID.ContentDisposition && part is MimePart)
            {
                ((MimePart)part).ContentDisposition = null;
            }

            base.Remove(name);
        }
Esempio n. 7
0
        public override string[] GetValues(string name)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Get", name);
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, "name"), "name");
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && part != null)
            {
                part.ContentType.PersistIfNeeded(this, false);
            }
            else if (id == MailHeaderID.ContentDisposition && part is MimePart)
            {
                ((MimePart)part).ContentDisposition.PersistIfNeeded(this, false);
            }
            return(base.GetValues(name));
        }
Esempio n. 8
0
#pragma warning disable CS8765 // Nullability of parameters 'name' and 'value' don't match overridden member
        public override void Add(string name, string value)
#pragma warning restore CS8765
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            if (name.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }
            if (value.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(value)), nameof(value));
            }

            MailBnfHelper.ValidateHeaderName(name);

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            value = value.Normalize(NormalizationForm.FormC);

            InternalAdd(name, value);
        }
Esempio n. 9
0
#pragma warning disable CS8610 // Nullability of reference types in type of parameter doesn't match overridden member.
        public override string[]? GetValues(string name)
#pragma warning restore CS8610
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.PersistIfNeeded(this, false);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition !.PersistIfNeeded(this, false);
            }
            return(base.GetValues(name));
        }
Esempio n. 10
0
        public override void Remove(string name)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType = null;
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition = null;
            }

            base.Remove(name);
        }
        public override string Get(string name)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Get", name);
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "name" }), "name");
            }
            MailHeaderID iD = MailHeaderInfo.GetID(name);

            if ((iD == MailHeaderID.ContentType) && (this.part != null))
            {
                this.part.ContentType.PersistIfNeeded(this, false);
            }
            else if ((iD == MailHeaderID.ContentDisposition) && (this.part is MimePart))
            {
                ((MimePart)this.part).ContentDisposition.PersistIfNeeded(this, false);
            }
            return(base.Get(name));
        }
Esempio n. 12
0
#pragma warning disable CS8765 // Nullability of parameters 'name' and 'value' don't match overridden member
        public override void Set(string name, string value)
#pragma warning restore CS8765
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (name.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            if (value.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(value)), nameof(value));
            }

            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.InvalidHeaderName);
            }

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            value = value.Normalize(NormalizationForm.FormC);

            base.Set(name, value);
        }
Esempio n. 13
0
 internal void PersistIfNeeded(HeaderCollection headers, bool forcePersist)
 {
     if (IsChanged || !_isPersisted || forcePersist)
     {
         headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentType) !, ToString());
         _isPersisted = true;
     }
 }
Esempio n. 14
0
 internal void PersistIfNeeded(HeaderCollection headers, bool forcePersist)
 {
     if ((this.IsChanged || !this.isPersisted) || forcePersist)
     {
         headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentDisposition), this.ToString());
         this.isPersisted = true;
     }
 }
Esempio n. 15
0
 internal void Set(string contentDisposition, HeaderCollection headers)
 {
     // we don't set ischanged because persistence was already handled
     // via the headers.
     _disposition = contentDisposition;
     ParseValue();
     headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentDisposition), ToString());
     _isPersisted = true;
 }
Esempio n. 16
0
        internal void PrepareHeaders(bool allowUnicode)
        {
            _contentType.PersistIfNeeded((HeaderCollection)Headers, false);
            _headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentType), _contentType.Encode(allowUnicode));

            if (_contentDisposition != null)
            {
                _contentDisposition.PersistIfNeeded((HeaderCollection)Headers, false);
                _headers.InternalSet(MailHeaderInfo.GetString(MailHeaderID.ContentDisposition), _contentDisposition.Encode(allowUnicode));
            }
        }
Esempio n. 17
0
 //add a new header and set its value
 internal void InternalAdd(string name, string value)
 {
     if (MailHeaderInfo.IsSingleton(name))
     {
         base.Set(name, value);
     }
     else
     {
         base.Add(name, value);
     }
 }
Esempio n. 18
0
        public override void Set(string name, string value)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Set", name.ToString() + "=" + value.ToString());
            }
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            if (value == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, nameof(value)), nameof(value));
            }

            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.GetString(SR.InvalidHeaderName));
            }

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            value = value.Normalize(Text.NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && part != null)
            {
                part.ContentType.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else if (id == MailHeaderID.ContentDisposition && part is MimePart)
            {
                ((MimePart)part).ContentDisposition.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else
            {
                base.Set(name, value);
            }
        }
Esempio n. 19
0
#pragma warning disable CS8765 // Nullability of parameters 'name' and 'value' don't match overridden member
        public override void Add(string name, string value)
#pragma warning restore CS8765
        {
            ArgumentException.ThrowIfNullOrEmpty(name);
            ArgumentException.ThrowIfNullOrEmpty(value);

            MailBnfHelper.ValidateHeaderName(name);

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            value = value.Normalize(NormalizationForm.FormC);

            InternalAdd(name, value);
        }
Esempio n. 20
0
        public override void Set(string name, string value)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            if (value == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(value)), nameof(name));
            }

            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.Format(SR.InvalidHeaderName));
            }

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            // TODO https://github.com/dotnet/corefx/issues/11747: Uncomment once we can use NormalizationForm
            //value = value.Normalize(NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else
            {
                base.Set(name, value);
            }
        }
Esempio n. 21
0
#pragma warning disable CS8610 // Nullability of reference types in type of parameter doesn't match overridden member.
        public override void Set(string name, string value)
#pragma warning restore CS8610
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }

            if (value == string.Empty)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(value)), nameof(value));
            }

            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.InvalidHeaderName);
            }

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            value = value.Normalize(NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.Set(value.ToLowerInvariant(), this);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition !.Set(value.ToLowerInvariant(), this);
            }
            else
            {
                base.Set(name, value);
            }
        }
        public override void Add(string name, string value)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Add", name.ToString() + "=" + value.ToString());
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            if (value == null)
            {
                throw new ArgumentNullException("value");
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, "name"), "name");
            }

            if (value == string.Empty)
            {
                throw new ArgumentException(SR.GetString(SR.net_emptystringcall, "value"), "name");
            }

            MailBnfHelper.ValidateHeaderName(name);

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            value = value.Normalize(Text.NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && part != null)
            {
                part.ContentType.Set(value.ToLower(), this);
            }
            else if (id == MailHeaderID.ContentDisposition && part is MimePart)
            {
                ((MimePart)part).ContentDisposition.Set(value.ToLower(), this);
            }
            else
            {
                InternalAdd(name, value);
            }
        }
Esempio n. 23
0
#pragma warning disable CS8765 // Nullability of parameters 'name' and 'value' don't match overridden member
        public override void Set(string name, string value)
#pragma warning restore CS8765
        {
            ArgumentException.ThrowIfNullOrEmpty(name);
            ArgumentException.ThrowIfNullOrEmpty(value);

            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.InvalidHeaderName);
            }

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            value = value.Normalize(NormalizationForm.FormC);

            base.Set(name, value);
        }
        public override void Set(string name, string value)
        {
            if (Logging.On)
            {
                Logging.PrintInfo(Logging.Web, this, "Set", name.ToString() + "=" + value.ToString());
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
            if (name == string.Empty)
            {
                throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "name" }), "name");
            }
            if (value == string.Empty)
            {
                throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "value" }), "name");
            }
            if (!MimeBasePart.IsAscii(name, false))
            {
                throw new FormatException(SR.GetString("InvalidHeaderName"));
            }
            name = MailHeaderInfo.NormalizeCase(name);
            MailHeaderID iD = MailHeaderInfo.GetID(name);

            if ((iD == MailHeaderID.ContentType) && (this.part != null))
            {
                this.part.ContentType.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else if ((iD == MailHeaderID.ContentDisposition) && (this.part is MimePart))
            {
                ((MimePart)this.part).ContentDisposition.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else
            {
                base.Set(name, value);
            }
        }
Esempio n. 25
0
 public override void Add(string name, string value)
 {
     if (name == null)
     {
         throw new ArgumentNullException("name");
     }
     if (value == null)
     {
         throw new ArgumentNullException("value");
     }
     if (name == string.Empty)
     {
         throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "name" }), "name");
     }
     if (value == string.Empty)
     {
         throw new ArgumentException(SR.GetString("net_emptystringcall", new object[] { "value" }), "name");
     }
     MailBnfHelper.ValidateHeaderName(name);
     if (!MimeBasePart.IsAnsi(value, false))
     {
         throw new FormatException(SR.GetString("InvalidHeaderValue"));
     }
     name = MailHeaderInfo.NormalizeCase(name);
     //MailHeaderID iD = MailHeaderInfo.GetID(name);
     //if ((iD == MailHeaderID.ContentType) && (this.part != null))
     //{
     //    this.part.ContentType.Set(value.ToLower(CultureInfo.InvariantCulture), this);
     //}
     //else if ((iD == MailHeaderID.ContentDisposition) && (this.part is MimePart))
     //{
     //    ((MimePart)this.part).ContentDisposition.Set(value.ToLower(CultureInfo.InvariantCulture), this);
     //}
     //else if (MailHeaderInfo.IsSingleton(name))
     //{
     //    base.Set(name, value);
     //}
     //else
     //{
     base.Add(name, value);
     //}
 }
Esempio n. 26
0
#pragma warning disable CS8765 // Nullability of parameters 'name' and 'value' don't match overridden member
        public override void Add(string name, string value)
#pragma warning restore CS8765
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            if (name.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(name)), nameof(name));
            }
            if (value.Length == 0)
            {
                throw new ArgumentException(SR.Format(SR.net_emptystringcall, nameof(value)), nameof(value));
            }

            MailBnfHelper.ValidateHeaderName(name);

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            value = value.Normalize(NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.Set(value.ToLowerInvariant(), this);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition !.Set(value.ToLowerInvariant(), this);
            }
            else
            {
                InternalAdd(name, value);
            }
        }
Esempio n. 27
0
        public override void Add(string name, string value)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            if (name == string.Empty)
            {
                throw new ArgumentException(string.Format(Strings.net_emptystringcall, nameof(name)), nameof(name));
            }
            if (value == string.Empty)
            {
                throw new ArgumentException(string.Format(Strings.net_emptystringcall, nameof(value)), nameof(name));
            }

            MailBnfHelper.ValidateHeaderName(name);

            // normalize the case of well known headers
            name = MailHeaderInfo.NormalizeCase(name);

            MailHeaderID id = MailHeaderInfo.GetID(name);

            value = value.Normalize(NormalizationForm.FormC);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition.Set(value.ToLower(CultureInfo.InvariantCulture), this);
            }
            else
            {
                InternalAdd(name, value);
            }
        }
Esempio n. 28
0
        public override string Get(string name)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (name == string.Empty)
            {
                throw new ArgumentException(string.Format(Strings.net_emptystringcall, nameof(name)), nameof(name));
            }

            MailHeaderID id = MailHeaderInfo.GetID(name);

            if (id == MailHeaderID.ContentType && _part != null)
            {
                _part.ContentType.PersistIfNeeded(this, false);
            }
            else if (id == MailHeaderID.ContentDisposition && _part is MimePart)
            {
                ((MimePart)_part).ContentDisposition.PersistIfNeeded(this, false);
            }
            return(base.Get(name));
        }
Esempio n. 29
0
        /// <summary>
        /// Extract headers from the text stream into the Headers collection of the ReceivedMessage object provided.
        /// </summary>
        /// <param name="reader">TextReader providing the data stream to be parsed</param>
        /// <param name="messageHeaders">Collection of message headers.</param>
        /// <param name="rawheaders">Raw text of headers as received from server.</param>
        /// <returns>Returns false if no headers were found. Otherwise returns true.</returns>
        private static bool LoadHeaders(TextReader reader, NameValueCollection messageHeaders, StringBuilder rawheaders)
        {
            Debug.WriteLine("LoadHeaders()");
            string line          = null;
            string lastHeaderKey = null;
            //multiple values with the same header key will be delimited by semi-colon.
            //semi-colon is reserved as a special character for header encoding in RFC 2047, so this should be safe
            Dictionary <string, StringBuilder> headersBuilders = new Dictionary <string, StringBuilder>(StringComparer.InvariantCultureIgnoreCase);
            Dictionary <string, string[]>      headers;

            Debug.WriteLine("Raw:");
            while (null != (line = reader.ReadLine()))
            {
                Debug.WriteLine(line);
                if (rawheaders != null)
                {
                    rawheaders.AppendLine(line);
                }

                //headers end with an empty line
                if (line == string.Empty || line.Trim() == string.Empty)
                {
                    break;
                }

                //some agents malform the key: value expression so that there is no space after the colon.
                //for example this BlackBerry Message-ID header
                //Message-ID:<*****@*****.**>
                Regex regex = new Regex(@"^([^:]+):\s?(.*)$");
                Match match = regex.Match(line);

                //if a line does not contain a colon it is either a continuation of a previous line or an error
                if (match.Success)
                {
                    //split header key from RFC 2047 encoded value

                    string headerkey = match.Groups[1].Value;

                    string value = match.Groups[2].Value;


                    if (!headersBuilders.ContainsKey(headerkey))
                    {
                        headersBuilders.Add(headerkey, new StringBuilder(value));
                    }
                    else
                    {
                        headersBuilders[headerkey].AppendFormat("|~|{0}", value);
                    }
                    lastHeaderKey = headerkey;
                }
                else
                {
                    //continuation line should start with whitespace
                    if (!string.IsNullOrEmpty(lastHeaderKey) && Regex.IsMatch(line, "^\\s"))
                    {
                        string h = line.TrimStart('\t', ' ');
                        headersBuilders[lastHeaderKey].AppendFormat("|~|{0}", h);
                    }
                    else //error in message format, skip ahead and attempt to continue parsing
                    {
                        lastHeaderKey = null;
                        continue;
                    }
                }
            }

            if (headersBuilders.Count == 0)
            {
                return(false);
            }

            headers = new Dictionary <string, string[]>(headersBuilders.Count, StringComparer.InvariantCultureIgnoreCase);
            foreach (string key in headersBuilders.Keys)
            {
                List <string> list = new List <string>(headersBuilders[key].ToString().Split(new[] { "|~|" }, StringSplitOptions.RemoveEmptyEntries));

                for (int i = 0; i < list.Count; i++)
                {
                    if (string.IsNullOrEmpty(list[i]))
                    {
                        list.RemoveAt(i);
                    }
                }
                headers.Add(key, list.ToArray());
            }

            InPlaceDecodeExtendedHeaders(headers);

            //add decoded headers to the ReceivedMessage parameter passed in to this method.

            /**************************************************************************
             * NOTE:
             * The NameValueCollction in MailMessage.Headers is actually an internal Type
             * called HeaderCollection. HeaderCollection has different behavior for header keys
             * that are defined as singleton. MailHeaderMsft.IsSingleton replicates the internal
             * test used by HeaderCollection.
             */
            Debug.WriteLine("Decoded:");
            foreach (string key in headers.Keys)
            {
                Debug.WriteLine("Key: " + key);
                //I believe IsSingleton is meant to indicate that the field should occur only once in the output
                //headers when the message is encoded for transport. The side-effect of the implementation is that it doesn't
                //allow adding multiple values to a single key in the NameValueCollection.
                if (MailHeaderInfo.IsSingleton(key))
                {
                    //HeaderCollection will use Set internally when Add is called
                    //need to join multiple values into a single string before adding or
                    //the last value to be added will be the final value and the others will be lost.
                    //therefore, components need to be combined into a single comma-separated string
                    //before being added.
                    string[] v     = headers[key];
                    string   value = string.Join(string.Empty, headers[key]);
                    //HeaderCollection.Add(string,string) throws an undocumented ArgumentException when being passed
                    //an empty string as a value. This is quite contrary to the behavior documented for NameValueCollection.Add(string,string)
                    //which explicitly permits null and empty strings to be added.
                    //the most common cause of this problem is a BCC: field with no value.
                    if (value != string.Empty)
                    {
                        messageHeaders.Add(key, value);
                    }
                }
                else
                {
                    for (int i = 0; i < headers[key].Length; i++)
                    {
                        if (!string.IsNullOrEmpty(headers[key][i]))
                        {
                            Debug.WriteLine(key + ": " + headers[key][i]);
                            messageHeaders.Add(key, headers[key][i]);
                        }
                    }
                }

                Debug.WriteLine(key + ": " + messageHeaders[key]);
            }

            return(true);
        }