Messages sent on SSL sessions will generate a single sent event when the last message SSL record is sent.
diff --git a/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java b/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java
index 2e0b5a8..39bf895 100644
--- a/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java
+++ b/core/src/main/java/org/apache/mina/session/DefaultWriteRequest.java
@@ -45,6 +45,8 @@
*/
private boolean secureInternal = false;
+ private boolean confirmRequested = true;
+
/**
* Creates a new instance of a WriteRequest, storing the message as it was
* when the IoSession.write() has been called.
@@ -57,6 +59,20 @@
}
/**
+ * Creates a new instance of a WriteRequest, storing the message as it was
+ * when the IoSession.write() has been called.
+ *
+ * @param message The message to write
+ * @param originalMessage the original message
+ * @param confirmRequested whether to send an event or not
+ */
+ public DefaultWriteRequest(Object message, Object originalMessage, boolean confirmRequested) {
+ this.message = message;
+ this.originalMessage = originalMessage;
+ this.confirmRequested = confirmRequested;
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
@@ -158,4 +174,9 @@
public void setSecureInternal(boolean secureInternal) {
this.secureInternal = secureInternal;
}
+
+ @Override
+ public boolean isConfirmRequested() {
+ return confirmRequested;
+ }
}
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/mina/session/WriteRequest.java b/core/src/main/java/org/apache/mina/session/WriteRequest.java
index cb43354..c054482 100644
--- a/core/src/main/java/org/apache/mina/session/WriteRequest.java
+++ b/core/src/main/java/org/apache/mina/session/WriteRequest.java
@@ -84,4 +84,11 @@
* @param secureInternal the secure internal flag
*/
void setSecureInternal(boolean secureInternal);
+
+ /**
+ * When this message has been set, should we send a corresponding send event
+ * or not.
+ * @return the send confirm flag
+ */
+ boolean isConfirmRequested();
}
\ No newline at end of file
diff --git a/core/src/main/java/org/apache/mina/transport/bio/BioUdpSession.java b/core/src/main/java/org/apache/mina/transport/bio/BioUdpSession.java
index a2ec97c..83f91c2 100644
--- a/core/src/main/java/org/apache/mina/transport/bio/BioUdpSession.java
+++ b/core/src/main/java/org/apache/mina/transport/bio/BioUdpSession.java
@@ -157,7 +157,7 @@
final Object highLevel = ((DefaultWriteRequest) writeRequest).getOriginalMessage();
- if (highLevel != null) {
+ if ((highLevel != null) && writeRequest.isConfirmRequested()) {
processMessageSent(highLevel);
}
diff --git a/core/src/main/java/org/apache/mina/transport/nio/AbstractNioSession.java b/core/src/main/java/org/apache/mina/transport/nio/AbstractNioSession.java
index 41a97b0..69b0250 100644
--- a/core/src/main/java/org/apache/mina/transport/nio/AbstractNioSession.java
+++ b/core/src/main/java/org/apache/mina/transport/nio/AbstractNioSession.java
@@ -231,7 +231,7 @@
final Object highLevel = ((DefaultWriteRequest) writeRequest).getOriginalMessage();
- if (highLevel != null) {
+ if ((highLevel != null) && writeRequest.isConfirmRequested()) {
processMessageSent(highLevel);
}
}
@@ -329,7 +329,7 @@
// generate the message sent event
final Object highLevel = ((DefaultWriteRequest) writeRequest).getOriginalMessage();
- if (highLevel != null) {
+ if ((highLevel != null) && writeRequest.isConfirmRequested()) {
processMessageSent(highLevel);
}
} else {
diff --git a/core/src/main/java/org/apache/mina/transport/nio/SslHelper.java b/core/src/main/java/org/apache/mina/transport/nio/SslHelper.java
index 83cce1b..aff0beb 100644
--- a/core/src/main/java/org/apache/mina/transport/nio/SslHelper.java
+++ b/core/src/main/java/org/apache/mina/transport/nio/SslHelper.java
@@ -420,9 +420,9 @@
appBuffer.flip();
done = buf.remaining() == 0;
if (done) {
- request = new DefaultWriteRequest(appBuffer);
+ request = new DefaultWriteRequest(appBuffer, buf, done);
} else {
- writeQueue.offer(new DefaultWriteRequest(appBuffer));
+ writeQueue.offer(new DefaultWriteRequest(appBuffer, buf, done));
appBuffer = ByteBuffer.allocateDirect(appBuffer.capacity());
}
break;
diff --git a/core/src/test/java/org/apache/mina/transport/nio/SslTest.java b/core/src/test/java/org/apache/mina/transport/nio/SslTest.java
index a376ad5..0c9d8f2 100644
--- a/core/src/test/java/org/apache/mina/transport/nio/SslTest.java
+++ b/core/src/test/java/org/apache/mina/transport/nio/SslTest.java
@@ -473,4 +473,31 @@
public void test1MMessageWithMINAClientBeforeHandshake() throws IOException, GeneralSecurityException, InterruptedException {
testMessage(1024 * 1024, Client.MINA_BEFORE_HANDSHAKE);
}
+
+ @Test
+ public void checkThatASingleMessageSentEventIsSent() throws IOException, GeneralSecurityException, InterruptedException {
+ final CountDownLatch counter = new CountDownLatch(1);
+ final byte[] message = new byte[1024 * 1024];
+ new Random().nextBytes(message);
+ final AtomicInteger sentCounter = new AtomicInteger();
+
+ NioTcpServer server = createReceivingServer(1024 * 1024, counter, null);
+ NioTcpClient client = new NioTcpClient();
+ client.getSessionConfig().setSslContext(createSSLContext());
+ client.setIoHandler(new AbstractIoHandler() {
+
+ @Override
+ public void handshakeCompleted(IoSession session) {
+ session.write(ByteBuffer.wrap(message));
+ }
+
+ @Override
+ public void messageSent(IoSession session, Object message) {
+ sentCounter.incrementAndGet();
+ }
+ });
+ client.connect(new InetSocketAddress(server.getServerSocketChannel().socket().getLocalPort()));
+ assertTrue(counter.await(10, TimeUnit.SECONDS));
+ assertEquals(5, sentCounter.get());
+ }
}