public void run(byte[] content, int repetitions) throws Exception { MimeTokenStream stream = new MimeTokenStream(); for (int i = 0; i < repetitions; i++) { stream.parse(new ByteArrayInputStream(content)); for (EntityState state = stream.getState(); state != EntityState.T_END_OF_STREAM; state = stream .next()) { } } } }
private byte[] mimeBodyContent() throws IOException, MimeException { final byte[] content; if (empty) { content = EMPTY; } else { parser.setRecursionMode(RecursionMode.M_FLAT); boolean valid = true; for (EntityState state = parser.getState(); state != EntityState.T_BODY && state != EntityState.T_START_MULTIPART; state = parser .next()) { if (state == EntityState.T_END_OF_STREAM) { valid = false; break; } } if (valid) { content = IOUtils.toByteArray(parser.getInputStream()); } else { content = EMPTY; } } return content; }
public void parse(InputStream in) { parser.setRecursionMode(RecursionMode.M_RECURSE); parser.parse(in); topLevel = true; }
InputStream instream = new ByteArrayInputStream( messageString.getBytes(encoding)); MimeTokenStream stream = new MimeTokenStream(); stream.parse(instream); for (EntityState state = stream.getState(); state != EntityState.T_END_OF_STREAM; state = stream .next()) { switch (state) { case T_BODY: if (debug) { System.out.println("Body detected, contents = " + stream.getInputStream() + ", header data = " + stream.getBodyDescriptor()); Field field = stream.getField(); if (debug) { System.out.println("Header field detected: " + stream.getField()); if (debug) { System.out.println("Multipart message detexted," + " header data = " + stream.getBodyDescriptor());
MimeConfig config = mimeTokenStream.getConfig(); if (config.getHeadlessParsing() != null) { Field contentType = mimeTokenStream.parseHeadless( instream, config.getHeadlessParsing()); handler.startMessage(); handler.endHeader(); } else { mimeTokenStream.parse(instream); EntityState state = mimeTokenStream.getState(); switch (state) { case T_BODY: BodyDescriptor desc = mimeTokenStream.getBodyDescriptor(); InputStream bodyContent; if (contentDecoding) { bodyContent = mimeTokenStream.getDecodedInputStream(); } else { bodyContent = mimeTokenStream.getInputStream(); break OUTER; case T_EPILOGUE: handler.epilogue(mimeTokenStream.getInputStream()); break; case T_FIELD: handler.field(mimeTokenStream.getField()); break; case T_PREAMBLE: handler.preamble(mimeTokenStream.getInputStream());
final MimeTokenStream parser = new MimeTokenStream(MimeConfig.PERMISSIVE, new DefaultBodyDescriptorBuilder()); parser.setRecursionMode(RecursionMode.M_NO_RECURSE); parser.parse(bIn); final HeaderImpl header = new HeaderImpl(); EntityState next = parser.next(); while (next != EntityState.T_BODY && next != EntityState.T_END_OF_STREAM && next != EntityState.T_START_MULTIPART) { if (next == EntityState.T_FIELD) { header.addField(parser.getField()); next = parser.next(); final MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser.getBodyDescriptor(); final PropertyBuilder propertyBuilder = new PropertyBuilder(); final String mediaType; final CountingInputStream bodyStream = new CountingInputStream(parser.getInputStream()); bodyStream.readAll(); long lines = bodyStream.getLineCount(); bodyStream.close(); next = parser.next(); if (next == EntityState.T_EPILOGUE) { final CountingInputStream epilogueStream = new CountingInputStream(parser.getInputStream()); epilogueStream.readAll(); lines += epilogueStream.getLineCount();
parser = new MimeTokenStream(config); parser.setRecursionMode(RecursionMode.M_NO_RECURSE); parser.parseHeadless(is, contentTypeString); while (parser.getState() != EntityState.T_START_BODYPART) { try { parser.next(); } catch (IOException ex) { throw new OMException(ex);
} else { results = new ArrayList<>(); for (EntityState state = parser.getState(); state != EntityState.T_END_HEADER; state = parser .next()) { switch (state) { case T_END_OF_STREAM: final String fieldValue = parser.getField().getBody().trim(); final String fieldName = parser.getField().getName(); ResultHeader header = new ResultHeader(fieldName, fieldValue); results.add(header);
if (parser.getState() == EntityState.T_BODY) { if (parser.next() != EntityState.T_END_BODYPART) { throw new IllegalStateException(); parser.next(); if (parser.getState() != EntityState.T_START_BODYPART) { return null; if (parser.next() != EntityState.T_START_HEADER) { throw new IllegalStateException(); while (parser.next() == EntityState.T_FIELD) { fields.add(parser.getField()); if (parser.next() != EntityState.T_BODY) { throw new IllegalStateException(); stream = new IncomingAttachmentInputStream(parser.getInputStream(), this);
public static MimeDescriptorImpl build(InputStream stream) throws IOException, MimeException { // Disable line length limit // See https://issues.apache.org/jira/browse/IMAP-132 // final MimeTokenStream parser = new MimeTokenStream(MimeConfig.PERMISSIVE, new DefaultBodyDescriptorBuilder()); parser.parse(stream); // TODO: Shouldn't this get set before we call the parse ? parser.setRecursionMode(RecursionMode.M_NO_RECURSE); return createDescriptor(parser); }
private List readHeaders() throws IOException, MimeException { if(log.isDebugEnabled()){ log.debug("readHeaders"); } checkParserState(parser.next(), EntityState.T_START_HEADER); List headers = new ArrayList(); while (parser.next() == EntityState.T_FIELD) { Field field = parser.getField(); String name = field.getName(); String value = field.getBody(); if (log.isDebugEnabled()){ log.debug("addHeader: (" + name + ") value=(" + value +")"); } headers.add(new Header(name, value)); } checkParserState(parser.next(), EntityState.T_BODY); return headers; }
private void moveToNextPart() { try { checkParserState(parser.next(), EntityState.T_END_BODYPART); EntityState state = parser.next(); if (state == EntityState.T_EPILOGUE) { while (parser.next() != EntityState.T_END_MULTIPART) { // Just loop } } else if (state != EntityState.T_START_BODYPART && state != EntityState.T_END_MULTIPART) { throw new IllegalStateException("Internal error: unexpected parser state " + state); } } catch (IOException ex) { throw new OMException(ex); } catch (MimeException ex) { throw new OMException(ex); } parser = null; }
private static MimeDescriptorImpl simplePartDescriptor( final MimeTokenStream parser, Collection<MessageResult.Header> headers) throws IOException, MimeException { MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser .getBodyDescriptor(); final MimeDescriptorImpl mimeDescriptorImpl; if ("message".equalsIgnoreCase(descriptor.getMediaType()) && "rfc822".equalsIgnoreCase(descriptor.getSubType())) { final CountingInputStream messageStream = new CountingInputStream( parser.getDecodedInputStream()); MimeDescriptorImpl embeddedMessageDescriptor = build(messageStream); final int octetCount = messageStream.getOctetCount(); final int lineCount = messageStream.getLineCount(); mimeDescriptorImpl = createDescriptor(octetCount, lineCount, descriptor, embeddedMessageDescriptor, headers); } else { final InputStream body = parser.getInputStream(); long bodyOctets = 0; long lines = 0; for (int n = body.read(); n >= 0; n = body.read()) { if (n == '\r') { lines++; } bodyOctets++; } mimeDescriptorImpl = createDescriptor(bodyOctets, lines, descriptor, null, headers); } return mimeDescriptorImpl; }
private static MimeDescriptorImpl compositePartDescriptor( final MimeTokenStream parser, Collection<MessageResult.Header> headers) throws IOException, MimeException { MaximalBodyDescriptor descriptor = (MaximalBodyDescriptor) parser .getBodyDescriptor(); MimeDescriptorImpl mimeDescriptor = createDescriptor(0, 0, descriptor, null, headers); EntityState next = parser.next(); while (next != EntityState.T_END_MULTIPART && next != EntityState.T_END_OF_STREAM) { if (next == EntityState.T_START_BODYPART) { mimeDescriptor.addPart(createDescriptor(parser)); } next = parser.next(); } return mimeDescriptor; }
public MimeStreamParser( final MimeConfig config, final DecodeMonitor monitor, final BodyDescriptorBuilder bodyDescBuilder) { this(new MimeTokenStream(config != null ? config : MimeConfig.DEFAULT, monitor, bodyDescBuilder)); }
currentPart = null; if (parser.getState() == EntityState.T_END_MULTIPART) { return null; } else {
/** * Gets a reader configured for the current body or body part. * The reader will return a transfer and charset decoded * stream of characters based on the MIME fields with the standard * defaults. * This is a conveniance method and relies on {@link #getInputStream()}. * Consult the javadoc for that method for known limitations. * * @return <code>Reader</code>, not null * @see #getInputStream * @throws IllegalStateException {@link #getState()} returns an * invalid value * @throws UnsupportedEncodingException if there is no JVM support * for decoding the charset */ public Reader getReader() throws UnsupportedEncodingException { final BodyDescriptor bodyDescriptor = getBodyDescriptor(); final String mimeCharset = bodyDescriptor.getCharset(); final Charset charset; if (mimeCharset == null || "".equals(mimeCharset)) { charset = Charsets.US_ASCII; } else { charset = CharsetUtil.lookup(mimeCharset); if (charset == null) { throw new UnsupportedEncodingException(mimeCharset); } } final InputStream instream = getDecodedInputStream(); return new InputStreamReader(instream, charset); }
private InputStream getDecodedInputStream() { InputStream in; if ("quoted-printable".equalsIgnoreCase(getHeader("Content-Transfer-Encoding"))) { // Temporary workaround for AXIOM-467 while waiting for MIME4J 0.7.3: // use a copy of QuotedPrintableInputStream from the 0.7 branch. in = new QuotedPrintableInputStream(parser.getInputStream(), true); } else { in = parser.getDecodedInputStream(); } if (log.isDebugEnabled()) { in = new DebugInputStream(in, log); } return in; }