/// <summary> /// Parses a <see cref="NameValueCollection"/> to a <see cref="MessageHeader"/> /// </summary> /// <param name="headers">The collection that should be traversed and parsed</param> /// <returns>A valid <see cref="MessageHeader"/> object</returns> /// <exception cref="ArgumentNullException">If <paramref name="headers"/> is <see langword="null"/></exception> private void ParseHeaders(NameValueCollection headers) { if (headers == null) { throw new ArgumentNullException("headers"); } // Now begin to parse the header values foreach (string headerName in headers.Keys) { string[] headerValues = headers.GetValues(headerName); if (headerValues != null) { foreach (string headerValue in headerValues) { try { ParseHeader(headerName, headerValue); } catch (Exception ex) { if (_parsingErrorHandler != null) { _parsingErrorHandler.HandleParseError(new ParseError(ex, headerValue, string.Format("On header {0}", headerName))); } else { throw; } } } } } }
/// <summary> /// Used to construct the topmost message part /// </summary> /// <param name="rawBody">The body that needs to be parsed</param> /// <param name="headers">The headers that should be used from the message</param> /// <param name="parsingErrorHandler">(Optional) It is notifified when an error occurs while parsing something in the message. /// If it is not null, the handler handles the error on the specific element without stopping the message parsing process</param> /// <exception cref="ArgumentNullException">If <paramref name="rawBody"/> or <paramref name="headers"/> is <see langword="null"/></exception> internal MessagePart(byte[] rawBody, MessageHeader headers, IParsingErrorHandler parsingErrorHandler = null) { if (rawBody == null) { throw new ArgumentNullException("rawBody"); } if (headers == null) { throw new ArgumentNullException("headers"); } _parsingErrorHandler = parsingErrorHandler; ContentType = headers.ContentType; ContentDescription = headers.ContentDescription; ContentTransferEncoding = headers.ContentTransferEncoding; ContentId = headers.ContentId; ContentDisposition = headers.ContentDisposition; FileName = FindFileName(ContentType, ContentDisposition, "(no name)"); try { BodyEncoding = ParseBodyEncoding(ContentType.CharSet); } catch (FormatException ex) { BodyEncoding = Encoding.UTF8; if (_parsingErrorHandler != null) { _parsingErrorHandler.HandleParseError(new ParseError(ex, ContentType.CharSet, string.Format("On body encoding. Encoding set to {0}", BodyEncoding.EncodingName))); } else { throw; } } ParseBody(rawBody); }
/// <summary> /// Used to construct the topmost message part /// </summary> /// <param name="rawBody">The body that needs to be parsed</param> /// <param name="headers">The headers that should be used from the message</param> /// <param name="parsingErrorHandler">(Optional) It is notifified when an error occurs while parsing something in the message. /// If it is not null, the handler handles the error on the specific element without stopping the message parsing process</param> /// <exception cref="ArgumentNullException">If <paramref name="rawBody"/> or <paramref name="headers"/> is <see langword="null"/></exception> internal MessagePart(byte[] rawBody, MessageHeader headers, IParsingErrorHandler parsingErrorHandler = null) { if(rawBody == null) throw new ArgumentNullException("rawBody"); if(headers == null) throw new ArgumentNullException("headers"); _parsingErrorHandler = parsingErrorHandler; ContentType = headers.ContentType; ContentDescription = headers.ContentDescription; ContentTransferEncoding = headers.ContentTransferEncoding; ContentId = headers.ContentId; ContentDisposition = headers.ContentDisposition; FileName = FindFileName(ContentType, ContentDisposition, "(no name)"); try { BodyEncoding = ParseBodyEncoding(ContentType.CharSet); } catch (FormatException ex) { BodyEncoding = Encoding.UTF8; if (_parsingErrorHandler != null) { _parsingErrorHandler.HandleParseError(new ParseError(ex, ContentType.CharSet, string.Format("On body encoding. Encoding set to {0}", BodyEncoding.EncodingName))); } else { throw; } } ParseBody(rawBody); }