Hide the TooBigObjectException and just throw a TooLongFrameException
This commit is contained in:
parent
6be409a4f6
commit
7b7c585cf3
@ -26,7 +26,10 @@ import org.jboss.marshalling.ByteInput;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class LimitingByteInput implements ByteInput {
|
class LimitingByteInput implements ByteInput {
|
||||||
|
|
||||||
|
// Use a static instance here to remove the overhead of fillStacktrace
|
||||||
|
private static final TooBigObjectException EXCEPTION = new TooBigObjectException();
|
||||||
|
|
||||||
private final ByteInput input;
|
private final ByteInput input;
|
||||||
private final long limit;
|
private final long limit;
|
||||||
private long read;
|
private long read;
|
||||||
@ -56,7 +59,7 @@ class LimitingByteInput implements ByteInput {
|
|||||||
read++;
|
read++;
|
||||||
return b;
|
return b;
|
||||||
} else {
|
} else {
|
||||||
throw new TooBigObjectException();
|
throw EXCEPTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +74,7 @@ class LimitingByteInput implements ByteInput {
|
|||||||
read += i;
|
read += i;
|
||||||
return i;
|
return i;
|
||||||
} else {
|
} else {
|
||||||
throw new TooBigObjectException();
|
throw EXCEPTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,11 +85,24 @@ class LimitingByteInput implements ByteInput {
|
|||||||
read += i;
|
read += i;
|
||||||
return i;
|
return i;
|
||||||
} else {
|
} else {
|
||||||
throw new TooBigObjectException();
|
throw EXCEPTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int readable(int length) {
|
private int readable(int length) {
|
||||||
return (int) Math.min(length, limit - read);
|
return (int) Math.min(length, limit - read);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception that will get thrown if the {@link Object} is to big to unmarshall
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static final class TooBigObjectException extends IOException {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
|||||||
import org.jboss.netty.channel.Channel;
|
import org.jboss.netty.channel.Channel;
|
||||||
import org.jboss.netty.channel.ChannelHandlerContext;
|
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||||
import org.jboss.netty.channel.ExceptionEvent;
|
import org.jboss.netty.channel.ExceptionEvent;
|
||||||
|
import org.jboss.netty.handler.codec.frame.TooLongFrameException;
|
||||||
import org.jboss.netty.handler.codec.replay.ReplayingDecoder;
|
import org.jboss.netty.handler.codec.replay.ReplayingDecoder;
|
||||||
import org.jboss.netty.handler.codec.replay.VoidEnum;
|
import org.jboss.netty.handler.codec.replay.VoidEnum;
|
||||||
|
|
||||||
@ -70,6 +71,8 @@ public class MarshallingDecoder extends ReplayingDecoder<VoidEnum> {
|
|||||||
Object obj = unmarshaller.readObject();
|
Object obj = unmarshaller.readObject();
|
||||||
unmarshaller.finish();
|
unmarshaller.finish();
|
||||||
return obj;
|
return obj;
|
||||||
|
} catch (LimitingByteInput.TooBigObjectException e) {
|
||||||
|
throw new TooLongFrameException("Object to big to unmarshal");
|
||||||
} finally {
|
} finally {
|
||||||
// Call close in a finally block as the ReplayingDecoder will throw an Error if not enough bytes are
|
// Call close in a finally block as the ReplayingDecoder will throw an Error if not enough bytes are
|
||||||
// readable. This helps to be sure that we do not leak resource
|
// readable. This helps to be sure that we do not leak resource
|
||||||
@ -98,7 +101,7 @@ public class MarshallingDecoder extends ReplayingDecoder<VoidEnum> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
|
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
|
||||||
if (e.getCause() instanceof TooBigObjectException) {
|
if (e.getCause() instanceof TooLongFrameException) {
|
||||||
e.getChannel().close();
|
e.getChannel().close();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package org.jboss.netty.handler.codec.marshalling;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Will get thrown if you try to unmarshal a Object that is to big
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class TooBigObjectException extends IOException {
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 533756617517705345L;
|
|
||||||
|
|
||||||
public TooBigObjectException() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
public TooBigObjectException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -32,6 +32,7 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
|||||||
import org.jboss.netty.buffer.ChannelBuffers;
|
import org.jboss.netty.buffer.ChannelBuffers;
|
||||||
import org.jboss.netty.handler.codec.embedder.CodecEmbedderException;
|
import org.jboss.netty.handler.codec.embedder.CodecEmbedderException;
|
||||||
import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
|
import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
|
||||||
|
import org.jboss.netty.handler.codec.frame.TooLongFrameException;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public abstract class AbstractMarshallingDecoderTest {
|
public abstract class AbstractMarshallingDecoderTest {
|
||||||
@ -116,7 +117,7 @@ public abstract class AbstractMarshallingDecoderTest {
|
|||||||
decoder.offer(ChannelBuffers.wrappedBuffer(testBytes));
|
decoder.offer(ChannelBuffers.wrappedBuffer(testBytes));
|
||||||
fail();
|
fail();
|
||||||
} catch (CodecEmbedderException e) {
|
} catch (CodecEmbedderException e) {
|
||||||
assertEquals(TooBigObjectException.class, e.getCause().getClass());
|
assertEquals(TooLongFrameException.class, e.getCause().getClass());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user