1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.mimo.netty.handler.codec.icap;
15
16 import java.util.List;
17
18 import org.jboss.netty.buffer.ChannelBuffer;
19 import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
20 import org.jboss.netty.handler.codec.http.HttpMethod;
21 import org.jboss.netty.handler.codec.http.HttpRequest;
22 import org.jboss.netty.handler.codec.http.HttpVersion;
23
24
25
26
27
28
29
30
31
32 public class ReadHttpRequestInitialAndHeadersState extends State<Object> {
33
34 public ReadHttpRequestInitialAndHeadersState(String name) {
35 super(name);
36 }
37
38 @Override
39 public void onEntry(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder) throws DecodingException {
40 if(icapMessageDecoder.message == null) {
41 throw new IllegalArgumentException("This state requires a valid IcapMessage instance");
42 }
43 if(icapMessageDecoder.message.getEncapsulatedHeader() == null) {
44 throw new IllegalArgumentException("This state requires a valid Encapsulation header instance");
45 }
46 }
47
48 @Override
49 public StateReturnValue execute(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder) throws DecodingException {
50 String line = IcapDecoderUtil.readLine(buffer,icapMessageDecoder.maxInitialLineLength);
51 String[] initialLine = IcapDecoderUtil.splitInitialLine(line);
52 HttpRequest message = new DefaultHttpRequest(HttpVersion.valueOf(initialLine[2]),HttpMethod.valueOf(initialLine[0]),initialLine[1]);
53 icapMessageDecoder.message.setHttpRequest(message);
54 List<String[]> headerList = IcapDecoderUtil.readHeaders(buffer,icapMessageDecoder.maxHttpHeaderSize);
55 message.clearHeaders();
56 for(String[] header : headerList) {
57 message.addHeader(header[0],header[1]);
58 }
59 Encapsulated encapsulated = icapMessageDecoder.message.getEncapsulatedHeader();
60 encapsulated.setEntryAsProcessed(encapsulated.getNextEntry());
61 if(encapsulated.getNextEntry() != null && encapsulated.getNextEntry().equals(IcapMessageElementEnum.RESHDR)) {
62 return StateReturnValue.createIrrelevantResult();
63 }
64 return StateReturnValue.createRelevantResult(icapMessageDecoder.message);
65 }
66
67 @Override
68 public StateEnum onExit(ChannelBuffer buffer, IcapMessageDecoder icapMessageDecoder, Object decisionInformation) throws DecodingException {
69 Encapsulated encapsulated = icapMessageDecoder.message.getEncapsulatedHeader();
70 IcapMessageElementEnum entry = encapsulated.getNextEntry();
71 if(entry != null) {
72 if(entry.equals(IcapMessageElementEnum.RESHDR)) {
73 return StateEnum.READ_HTTP_RESPONSE_INITIAL_AND_HEADERS;
74 }
75 if(entry.equals(IcapMessageElementEnum.REQBODY)) {
76 return StateEnum.READ_CHUNK_SIZE_STATE;
77 }
78 if(entry.equals(IcapMessageElementEnum.RESBODY)) {
79 return StateEnum.READ_CHUNK_SIZE_STATE;
80 }
81 }
82 return null;
83 }
84
85 }