From 466f7ee30100b520c80a00408a7dc3ef5e34f693 Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Tue, 18 Dec 2012 20:09:38 -0800 Subject: [PATCH 1/6] Fixed bug in IcapHeaders.removeHeader where removing the last header messed up the head reference --- .../mimo/netty/handler/codec/icap/IcapHeaders.java | 3 +++ .../netty/handler/codec/icap/IcapHeaderTest.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/IcapHeaders.java b/src/main/java/ch/mimo/netty/handler/codec/icap/IcapHeaders.java index 01a145f..399521b 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/IcapHeaders.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/IcapHeaders.java @@ -334,6 +334,9 @@ public void removeHeader(String name) { after.before = before; entry = after; } else { + if (head == entry) { + head = entry.before; + } entry = null; } } else { diff --git a/src/test/java/ch/mimo/netty/handler/codec/icap/IcapHeaderTest.java b/src/test/java/ch/mimo/netty/handler/codec/icap/IcapHeaderTest.java index 582a1c2..701c06f 100644 --- a/src/test/java/ch/mimo/netty/handler/codec/icap/IcapHeaderTest.java +++ b/src/test/java/ch/mimo/netty/handler/codec/icap/IcapHeaderTest.java @@ -330,4 +330,17 @@ public void getDateHeader() { Date returnedDate = headers.getDateHeader(IcapHeaders.Names.DATE); assertNotNull("The returned date was null",returnedDate); } + + @Test + public void removeAddHead() { + IcapHeaders headers = new IcapHeaders(); + headers.addHeader("fuz", "buz"); + headers.addHeader("foo", "bar"); + assertTrue("Header 'FOO' should exist (1)", headers.containsHeader("foo")); + assertEquals("Header 'FOO' should be 'bar'", "bar", headers.getHeader("foo")); + headers.removeHeader("foo"); + headers.addHeader("foo", "baz"); + assertTrue("Header 'FOO' should exist (2)", headers.containsHeader("foo")); + assertEquals("Header 'FOO' should be 'baz'", "baz", headers.getHeader("foo")); + } } From af37b46a682eef5d8c4c2502f9b1464f9db17205 Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Tue, 18 Dec 2012 20:40:54 -0800 Subject: [PATCH 2/6] Patch for ReadIcapHeaderState to accommodate malformed ICAP error messages --- .../mimo/netty/handler/codec/icap/ReadIcapHeaderState.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java index 45d7698..6b0f542 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java @@ -119,7 +119,7 @@ private void validateMandatoryMessageHeaders(IcapMessage message) { private void handleEncapsulationHeaderVolatility(IcapMessage message) { // Pseudo code // IF Encapsulated header is missing - // IF OPTIONS request OR 100 Continue response OR 204 No Content response + // IF OPTIONS request OR 100 Continue response OR 204 No Content response OR is a server error // THEN inject synthetic null-body Encapsulated header. boolean requiresSynthecticEncapsulationHeader = false; if(!message.containsHeader(IcapHeaders.Names.ENCAPSULATED)) { @@ -128,7 +128,9 @@ private void handleEncapsulationHeaderVolatility(IcapMessage message) { } else if(message instanceof IcapResponse) { IcapResponse response = (IcapResponse)message; IcapResponseStatus status = response.getStatus(); - if(status.equals(IcapResponseStatus.CONTINUE) | status.equals(IcapResponseStatus.NO_CONTENT)) { + if(status.equals(IcapResponseStatus.CONTINUE) || + status.equals(IcapResponseStatus.NO_CONTENT) || + (status.getCode() >= 500)) { requiresSynthecticEncapsulationHeader = true; } } From 3f102c1b73056539abb415c943e3964b4a7d9f9a Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Thu, 17 Jan 2013 11:20:32 -0800 Subject: [PATCH 3/6] Fixed spelling in chunk toString methods --- .../java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunk.java | 2 +- .../mimo/netty/handler/codec/icap/DefaultIcapChunkTrailer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunk.java b/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunk.java index 5c77eb7..ca43dfc 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunk.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunk.java @@ -51,6 +51,6 @@ public boolean isEarlyTerminated() { } public String toString() { - return "DeafultIcapChunk: [isPreviewChunk=" + preview + "] [wasEarlyTerminated=" + earlyTerminated + "] [data=" + getContent().readableBytes() + "]"; + return "DefaultIcapChunk: [isPreviewChunk=" + preview + "] [wasEarlyTerminated=" + earlyTerminated + "] [data=" + getContent().readableBytes() + "]"; } } diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunkTrailer.java b/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunkTrailer.java index 0b0223f..8b0bf84 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunkTrailer.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/DefaultIcapChunkTrailer.java @@ -63,6 +63,6 @@ public boolean isEarlyTerminated() { } public String toString() { - return "DeafultIcapChunkTrailer: [isPreviewChunk=" + preview + "] [wasEarlyTerminated=" + earlyTerminated + "]"; + return "DefaultIcapChunkTrailer: [isPreviewChunk=" + preview + "] [wasEarlyTerminated=" + earlyTerminated + "]"; } } From cad4ada7e8c4307765cd27e41098bbe4ae73acd2 Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Fri, 15 Feb 2013 20:19:57 -0800 Subject: [PATCH 4/6] Reset initial decoding state when initial line does not parse --- .../netty/handler/codec/icap/ReadIcapInitialState.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapInitialState.java b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapInitialState.java index 321dca4..a164035 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapInitialState.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapInitialState.java @@ -39,7 +39,14 @@ public void onEntry(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder) @Override public StateReturnValue execute(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder) throws DecodingException { String[] initialLine = IcapDecoderUtil.splitInitialLine(IcapDecoderUtil.readLine(buffer,icapMessageDecoder.maxInitialLineLength)); - icapMessageDecoder.message = icapMessageDecoder.createMessage(initialLine); + if (initialLine.length >= 3) { + try { + icapMessageDecoder.message = icapMessageDecoder.createMessage(initialLine); + } + catch (IllegalArgumentException e) { + icapMessageDecoder.message = null; + } + } return StateReturnValue.createIrrelevantResult(); } From 245cf80289b6c8fe64b7baa7d255861eda1914bb Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Mon, 4 Mar 2013 16:21:55 -0800 Subject: [PATCH 5/6] Unset preview header on early terminated previews (simplified version of GlobalVelocity/netty-icap@5dbd9923e59bb0d5bc86424a0be8af64fa881d7a) --- .../ch/mimo/netty/handler/codec/icap/IcapChunkAggregator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/IcapChunkAggregator.java b/src/main/java/ch/mimo/netty/handler/codec/icap/IcapChunkAggregator.java index fa64fb5..dbaed2c 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/IcapChunkAggregator.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/IcapChunkAggregator.java @@ -116,6 +116,10 @@ public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Ex ctx.sendUpstream(e); } else { IcapChunkTrailer trailer = (IcapChunkTrailer)msg; + if (trailer.isEarlyTerminated()) { + LOG.debug("chunk trailer is early terminated, removing PREVIEW header"); + message.getIcapMessage().removeHeader(IcapHeaders.Names.PREVIEW); + } if(trailer.getHeaderNames().size() > 0) { for(String name : trailer.getHeaderNames()) { message.addHeader(name,trailer.getHeader(name)); From 37c21f2c53fc7cbf3b9428d1be363fe2798530bc Mon Sep 17 00:00:00 2001 From: Barry Ferg Date: Thu, 7 Mar 2013 17:27:07 -0800 Subject: [PATCH 6/6] Fixed logic operator from bit-wise and to logical and --- .../ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java index 6b0f542..7be84b1 100644 --- a/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java +++ b/src/main/java/ch/mimo/netty/handler/codec/icap/ReadIcapHeaderState.java @@ -63,7 +63,7 @@ public StateReturnValue execute(ChannelBuffer buffer, IcapMessageDecoder icapMes } if(isOptionsRequest) { return StateReturnValue.createRelevantResult(icapMessageDecoder.message); - } else if(encapsulated != null && !encapsulated.containsEntry(IcapMessageElementEnum.REQHDR) & !encapsulated.containsEntry(IcapMessageElementEnum.RESHDR)) { + } else if(encapsulated != null && !encapsulated.containsEntry(IcapMessageElementEnum.REQHDR) && !encapsulated.containsEntry(IcapMessageElementEnum.RESHDR)) { return StateReturnValue.createRelevantResult(icapMessageDecoder.message); } return StateReturnValue.createIrrelevantResult();