@Override public StateEnum onExit( ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder, Object decisionInformation) throws DecodingException { IcapMessage message = icapMessageDecoder.message; Encapsulated encapsulated = message.getEncapsulatedHeader(); if (message instanceof IcapRequest && ((IcapRequest) message).getMethod().equals(IcapMethod.OPTIONS)) { if (encapsulated != null && encapsulated.containsEntry(IcapMessageElementEnum.OPTBODY)) { return StateEnum.READ_CHUNK_SIZE_STATE; } else { return null; } } else { IcapMessageElementEnum entry = encapsulated.getNextEntry(); if (entry != null) { if (entry.equals(IcapMessageElementEnum.REQHDR)) { return StateEnum.READ_HTTP_REQUEST_INITIAL_AND_HEADERS; } else if (entry.equals(IcapMessageElementEnum.RESHDR)) { return StateEnum.READ_HTTP_RESPONSE_INITIAL_AND_HEADERS; } else if (entry.equals(IcapMessageElementEnum.REQBODY)) { return StateEnum.READ_CHUNK_SIZE_STATE; } else if (entry.equals(IcapMessageElementEnum.RESBODY)) { return StateEnum.READ_CHUNK_SIZE_STATE; } } } return null; }
@Override public StateReturnValue execute(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder) throws DecodingException { List<String[]> headerList = IcapDecoderUtil.readHeaders(buffer, icapMessageDecoder.maxIcapHeaderSize); icapMessageDecoder.message.clearHeaders(); for (String[] header : headerList) { icapMessageDecoder.message.addHeader(header[0], header[1]); } boolean isRequest = icapMessageDecoder.message instanceof IcapRequest; boolean isOptionsRequest = isRequest && ((IcapRequest) icapMessageDecoder.message).getMethod().equals(IcapMethod.OPTIONS); handleEncapsulationHeaderVolatility(icapMessageDecoder.message); validateMandatoryMessageHeaders(icapMessageDecoder.message); Encapsulated encapsulated = null; String headerValue = icapMessageDecoder.message.getHeader(IcapHeaders.Names.ENCAPSULATED); if (headerValue != null) { encapsulated = new Encapsulated(icapMessageDecoder.message.getHeader(IcapHeaders.Names.ENCAPSULATED)); icapMessageDecoder.message.setEncapsulatedHeader(encapsulated); } if (isOptionsRequest) { return StateReturnValue.createRelevantResult(icapMessageDecoder.message); } else if (encapsulated != null && !encapsulated.containsEntry(IcapMessageElementEnum.REQHDR) & !encapsulated.containsEntry(IcapMessageElementEnum.RESHDR)) { return StateReturnValue.createRelevantResult(icapMessageDecoder.message); } return StateReturnValue.createIrrelevantResult(); }