From 6aaa145e7ce856c89198255a28f71d3ababf84ac Mon Sep 17 00:00:00 2001 From: mguessan Date: Wed, 18 Feb 2015 00:42:15 +0000 Subject: [PATCH] SMTP: use content chunk to send large messages git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@2346 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../exchange/ews/CreateItemMethod.java | 1 + src/java/davmail/exchange/ews/EWSMethod.java | 43 ++++++++++++++----- src/java/davmailmessages.properties | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/java/davmail/exchange/ews/CreateItemMethod.java b/src/java/davmail/exchange/ews/CreateItemMethod.java index d486fd09..75fa1e91 100644 --- a/src/java/davmail/exchange/ews/CreateItemMethod.java +++ b/src/java/davmail/exchange/ews/CreateItemMethod.java @@ -34,6 +34,7 @@ public class CreateItemMethod extends EWSMethod { this.savedItemFolderId = savedItemFolderId; this.item = item; addMethodOption(messageDisposition); + setContentChunked(true); } /** diff --git a/src/java/davmail/exchange/ews/EWSMethod.java b/src/java/davmail/exchange/ews/EWSMethod.java index 25a50a47..04fbb08d 100644 --- a/src/java/davmail/exchange/ews/EWSMethod.java +++ b/src/java/davmail/exchange/ews/EWSMethod.java @@ -25,7 +25,10 @@ import davmail.http.DavGatewayHttpClientFacade; import davmail.ui.tray.DavGatewayTray; import davmail.util.StringUtil; import org.apache.commons.codec.binary.Base64; -import org.apache.commons.httpclient.*; +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpConnection; +import org.apache.commons.httpclient.HttpState; +import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.RequestEntity; import org.apache.log4j.Level; @@ -45,6 +48,7 @@ import java.util.zip.GZIPInputStream; @SuppressWarnings("Since15") public abstract class EWSMethod extends PostMethod { protected static final Logger LOGGER = Logger.getLogger(EWSMethod.class); + protected static final int CHUNK_LENGTH = 131072; protected FolderQueryTraversal traversal; protected BaseShape baseShape; @@ -114,6 +118,7 @@ public abstract class EWSMethod extends PostMethod { !Level.DEBUG.toString().equals(Settings.getProperty("log4j.logger.httpclient.wire"))) { setRequestHeader("Accept-Encoding", "gzip"); } + setRequestEntity(new RequestEntity() { byte[] content; @@ -122,10 +127,27 @@ public abstract class EWSMethod extends PostMethod { } public void writeRequest(OutputStream outputStream) throws IOException { + boolean firstPass = content == null; if (content == null) { content = generateSoapEnvelope(); } - outputStream.write(content); + if (content.length < CHUNK_LENGTH) { + outputStream.write(content); + } else { + int i = 0; + while (i < content.length) { + int length = CHUNK_LENGTH; + if (i + CHUNK_LENGTH > content.length) { + length = content.length - i; + } + outputStream.write(content, i, length); + if (!firstPass) { + DavGatewayTray.debug(new BundleMessage("LOG_UPLOAD_PROGRESS", String.valueOf((i + length) / 1024), (i + length) * 100 / content.length)); + DavGatewayTray.switchIcon(); + } + i += CHUNK_LENGTH; + } + } } public long getContentLength() { @@ -202,7 +224,7 @@ public abstract class EWSMethod extends PostMethod { itemId.write(writer); } if (itemIds != null) { - for (ItemId localItemId:itemIds) { + for (ItemId localItemId : itemIds) { localItemId.write(writer); } } @@ -412,7 +434,7 @@ public abstract class EWSMethod extends PostMethod { protected void writeIndexedPageView(Writer writer) throws IOException { if (maxCount > 0) { - writer.write("