From 09f4651f340aee430254c8b367cb9830162efe55 Mon Sep 17 00:00:00 2001
From: Yannick Lecaillez <yannick.lecaillez@forgerock.com>
Date: Mon, 07 Nov 2016 16:40:20 +0000
Subject: [PATCH] OPENDJ-3179: Migrate LDAP Connection Handler to SDK Grizzly transport
---
opendj-grizzly/src/main/java/org/forgerock/opendj/grizzly/LdapCodec.java | 55 ++++++++++++++++++++-----------------------------------
1 files changed, 20 insertions(+), 35 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 b20e71c..2130e0a 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,6 @@
import org.forgerock.opendj.ldap.spi.LdapMessages.LdapRequestEnvelope;
import org.forgerock.opendj.ldap.spi.LdapMessages.LdapResponseMessage;
import org.glassfish.grizzly.Buffer;
-import org.glassfish.grizzly.attributes.AttributeStorage;
import org.glassfish.grizzly.filterchain.FilterChainContext;
import org.glassfish.grizzly.filterchain.NextAction;
@@ -57,14 +56,26 @@
public NextAction handleRead(final FilterChainContext ctx) throws IOException {
try {
final Buffer buffer = ctx.getMessage();
- final LdapRequestEnvelope message;
-
- message = readMessage(buffer, ctx.getConnection());
- if (message != null) {
- ctx.setMessage(message);
- return ctx.getInvokeAction(getRemainingBuffer(buffer));
+ try (final ASN1BufferReader reader = new ASN1BufferReader(maxASN1ElementSize, buffer)) {
+ buffer.mark();
+ if (!reader.elementAvailable()) {
+ buffer.reset();
+ return ctx.getStopAction(buffer);
+ }
+ final int length = reader.peekLength();
+ if (length > maxASN1ElementSize) {
+ buffer.reset();
+ throw DecodeException.fatalError(
+ ERR_LDAP_CLIENT_DECODE_MAX_REQUEST_SIZE_EXCEEDED.get(length, maxASN1ElementSize));
+ }
+ final Buffer remainder = (buffer.remaining() > length)
+ ? buffer.split(buffer.position() + length)
+ : null;
+ buffer.reset();
+ ctx.setMessage(decodePacket(new ASN1BufferReader(maxASN1ElementSize, buffer)));
+ buffer.tryDispose();
+ return ctx.getInvokeAction(remainder);
}
- return ctx.getStopAction(getRemainingBuffer(buffer));
} catch (Exception e) {
onLdapCodecError(ctx, e);
ctx.getConnection().closeSilently();
@@ -76,29 +87,7 @@
protected abstract void onLdapCodecError(FilterChainContext ctx, Throwable error);
- private LdapRequestEnvelope readMessage(final Buffer buffer, final AttributeStorage attributeStorage)
- throws IOException {
- try (final ASN1BufferReader reader = new ASN1BufferReader(maxASN1ElementSize, buffer)) {
- final int packetStart = buffer.position();
- if (!reader.elementAvailable()) {
- buffer.position(packetStart);
- return null;
- }
- final int length = reader.peekLength();
- if (length > maxASN1ElementSize) {
- buffer.position(packetStart);
- throw DecodeException.fatalError(
- ERR_LDAP_CLIENT_DECODE_MAX_REQUEST_SIZE_EXCEEDED.get(length, maxASN1ElementSize));
- }
-
- final Buffer packet = buffer.slice(packetStart, buffer.position() + length);
- buffer.position(buffer.position() + length);
-
- return decodePacket(new ASN1BufferReader(maxASN1ElementSize, packet), attributeStorage);
- }
- }
-
- private LdapRequestEnvelope decodePacket(final ASN1BufferReader reader, final AttributeStorage attributeStorage)
+ private LdapRequestEnvelope decodePacket(final ASN1BufferReader reader)
throws IOException {
reader.mark();
try {
@@ -138,10 +127,6 @@
}
}
- private Buffer getRemainingBuffer(final Buffer buffer) {
- return buffer.hasRemaining() ? buffer : null;
- }
-
@Override
public NextAction handleWrite(final FilterChainContext ctx) throws IOException {
final LdapResponseMessage response = ctx.<LdapResponseMessage>getMessage();
--
Gitblit v1.10.0