public MultipartMessage ParseMessage(string contentType, Stream inputStream) { if (log.IsDebugEnabled) log.DebugFormat("Message content-type: '{0}'", contentType); HeaderField contentTypeField = ParseHeaderField( HttpConstants.ContentType, contentType); MultipartMessage message = new MultipartMessage(contentTypeField); if (!message.IsMultipart) throw ParserException("This is not a MIME multipart message. The content type '{0}' is not supported", contentType); if (log.IsDebugEnabled) log.DebugFormat("Multipart message boundary: '{0}'", message.Boundary); BinaryBufferWithPatternWatching buffer = new BinaryBufferWithPatternWatching( ConstructDelimiterBuffer(message)); try { SkipToFirstDelimiter(inputStream, buffer); while (true) { int markerByte1 = inputStream.ReadByte(); int markerByte2 = inputStream.ReadByte(); if (markerByte1 == -1 || markerByte2 == -1) throw ParserException("Unexpected end of stream (1)."); if ((byte)markerByte1 == '-' && (byte)markerByte2 == '-') break; if ((byte)markerByte1 == '\r' && (byte)markerByte2 == '\n') { MultipartMessagePart part = ReadPart(message, inputStream, buffer); message.AddPart(part); } else throw ParserException("Invalid multipart message: unexpected message part markers."); } return message; } catch (EndOfStreamException ex) { throw new MultipartMessageParserException("Unexpected end of stream.", ex); } }
public void WriteMessageAsAWhole() { string boundary = "-----Test"; MultipartMessage message = new MultipartMessage(HeaderField.Parse("Content-type: multipart/mixed; boundary=-----Test")); MultipartMessagePart part; part = new MultipartMessagePart(); part.AddHeader(new HeaderField("Content-Type", "text/plain")); part.Data = Encoding.UTF8.GetBytes("my text"); message.AddPart(part); part = new MultipartMessagePart(); part.AddHeader(new HeaderField("Content-Type", "application/xml")); part.Data = Encoding.UTF8.GetBytes("<tag/>"); message.AddPart(part); using (MemoryStream stream = new MemoryStream()) { long writtenBytes; using (MultipartStreamWriter writer = new MultipartStreamWriter( stream, boundary, Encoding.UTF8)) { writer.WriteWholeMessage(message); writtenBytes = writer.BytesWritten; } byte[] bytes = stream.ToArray(); Assert.AreEqual(bytes.Length, writtenBytes); string result = Encoding.UTF8.GetString(bytes); Assert.AreEqual("\r\n-------Test\r\nContent-Type: text/plain\r\n\r\nmy text\r\n-------Test\r\nContent-Type: application/xml\r\n\r\n<tag/>\r\n-------Test--", result); } }
public MultipartMessage ParseMessage(string contentType, Stream inputStream) { if (log.IsDebugEnabled) { log.DebugFormat("Message content-type: '{0}'", contentType); } HeaderField contentTypeField = ParseHeaderField( HttpConstants.ContentType, contentType); MultipartMessage message = new MultipartMessage(contentTypeField); if (!message.IsMultipart) { throw ParserException("This is not a MIME multipart message. The content type '{0}' is not supported", contentType); } if (log.IsDebugEnabled) { log.DebugFormat("Multipart message boundary: '{0}'", message.Boundary); } BinaryBufferWithPatternWatching buffer = new BinaryBufferWithPatternWatching( ConstructDelimiterBuffer(message)); try { SkipToFirstDelimiter(inputStream, buffer); while (true) { int markerByte1 = inputStream.ReadByte(); int markerByte2 = inputStream.ReadByte(); if (markerByte1 == -1 || markerByte2 == -1) { throw ParserException("Unexpected end of stream (1)."); } if ((byte)markerByte1 == '-' && (byte)markerByte2 == '-') { break; } if ((byte)markerByte1 == '\r' && (byte)markerByte2 == '\n') { MultipartMessagePart part = ReadPart(message, inputStream, buffer); message.AddPart(part); } else { throw ParserException("Invalid multipart message: unexpected message part markers."); } } return(message); } catch (EndOfStreamException ex) { throw new MultipartMessageParserException("Unexpected end of stream.", ex); } }