From 5511a94238385a30b5b516ee360b234ff56d7c3f Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Mon, 07 Nov 2016 13:59:40 +0000
Subject: [PATCH] OPENDJ-3179: Migrate LDAP Connection Handler to SDK Grizzly transport
---
opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java | 38 ++++++++++++++++++++++++++++++--------
1 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
index 730a7b1..b58139b 100644
--- a/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
+++ b/opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java
@@ -36,7 +36,7 @@
import org.glassfish.grizzly.filterchain.FilterChainContext;
import org.glassfish.grizzly.filterchain.NextAction;
-final class LdapCodec extends LDAPBaseFilter {
+abstract class LdapCodec extends LDAPBaseFilter {
LdapCodec(final int maxElementSize, final DecodeOptions decodeOptions) {
super(decodeOptions, maxElementSize);
@@ -44,15 +44,29 @@
@Override
public NextAction handleRead(final FilterChainContext ctx) throws IOException {
- final Buffer buffer = ctx.getMessage();
- final LdapRawMessage message = readMessage(buffer);
- if (message != null) {
- ctx.setMessage(message);
- return ctx.getInvokeAction(getRemainingBuffer(buffer));
+ try {
+ final Buffer buffer = ctx.getMessage();
+ final LdapRawMessage message;
+
+ message = readMessage(buffer);
+ if (message != null) {
+ ctx.setMessage(message);
+ return ctx.getInvokeAction(getRemainingBuffer(buffer));
+ }
+ return ctx.getStopAction(getRemainingBuffer(buffer));
+ } catch (Exception e) {
+ onLdapCodecError(ctx, e);
+ // make the connection deaf to any following input
+ // onLdapDecodeError call will take care of error processing
+ // and closing the connection
+ final NextAction suspendAction = ctx.getSuspendAction();
+ ctx.completeAndRecycle();
+ return suspendAction;
}
- return ctx.getStopAction(getRemainingBuffer(buffer));
}
+ protected abstract void onLdapCodecError(FilterChainContext ctx, Throwable error);
+
private LdapRawMessage readMessage(final Buffer buffer) throws IOException {
try (final ASN1BufferReader reader = new ASN1BufferReader(maxASN1ElementSize, buffer)) {
final int packetStart = buffer.position();
@@ -123,10 +137,18 @@
try {
final Buffer buffer = toBuffer(writer, ctx.<LdapResponseMessage> getMessage());
ctx.setMessage(buffer);
+ return ctx.getInvokeAction();
+ } catch (Exception e) {
+ onLdapCodecError(ctx, e);
+ // make the connection deaf to any following input
+ // onLdapDecodeError call will take care of error processing
+ // and closing the connection
+ final NextAction suspendAction = ctx.getSuspendAction();
+ ctx.completeAndRecycle();
+ return suspendAction;
} finally {
GrizzlyUtils.recycleWriter(writer);
}
- return ctx.getInvokeAction();
}
private Buffer toBuffer(final LDAPWriter<ASN1BufferWriter> writer, final LdapResponseMessage message)
--
Gitblit v1.10.0