Hi,
I am having some server application which uses Http protocol over SSL to
communicate with the clients. So far we had developed our own codecs to handle
the HTTP protocol, but as I wanted to week it as simple as possible, I decided
to refactor it to use the http module
acceptor.getFilterChain().addLast( "sslFilter", sslFilter );
acceptor.getFilterChain().addLast( "protocolFilter", new ProtocolCodecFilter(
HttpServerEncoder.class, HttpServerDecoder.class));
After struggling for a while I manage to make the server work for the simpler
case: client request - server answers.
// --------- CLIENT REQUEST ---------
@Override
public void messageReceived( IoSession session, Object message) throws
Exception {
String sessionInfo = LogUtils.getSessionInfo(session);
if (message instanceof HttpRequest) {
HttpRequest incomingRequest = (HttpRequest) message;
/* ... */
}
else if (message instanceof IoBuffer) {
IoBuffer buf = (IoBuffer)message;
CharBuffer charBuffer = decoder.decode(buf.buf());
String body = charBuffer.toString();
buf.free();
}
else if (message instanceof HttpEndOfContent) {
/* processRequest */
}
}
// --------------- SERVER RESPONSE -------------
public void sendResponse(IoSession session, HttpStatus responseCode,
String response, boolean isJson, boolean closeSession) throws
CharacterCodingException {
String dt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss
zzz").format(new Date());
Map<String, String> headers = new HashMap<String, String>();
headers.put("Cache-Control", "private");
headers.put("Date", dt);
headers.put("Last-Modified", dt);
if (isJson){
headers.put("Content-Type", "application/json;
charset=utf-8");
} else {
headers.put("Content-Type", "application/xml;
charset=utf-8");
}
if (closeSession) {
headers.put("Connection", "Close");
}
if (StringUtils.isEmpty(response)){
headers.put("Content-Length", "0");
session.write(new
DefaultHttpResponse(HttpVersion.HTTP_1_1, responseCode, headers));
} else {
byte[] responseBytes = response.getBytes(utf8);
headers.put("Content-Length",
String.valueOf(responseBytes.length));
session.write(new
DefaultHttpResponse(HttpVersion.HTTP_1_1, responseCode, headers));
IoBuffer buf = IoBuffer.allocate(responseBytes.length);
buf.put(responseBytes);
buf.flip();
session.write(buf);
buf.free();
}
session.write(new HttpEndOfContent());
if (closeSession){
session.close(false);
}
}
After sending the response, we don't want to close the session because we need
to wait for the client to make a second request. The problem that I have step
into is that, when we make this second request, we get this exception:
2013-11-27 10:04:16,886 ERROR [NioProcessor-2] (DabServerHandler.java:71) -
[127.0.0.1] id(1) - EXCEPTION : java.lang.IllegalArgumentException: No enum
constant org.apache.mina.http.api.HttpMethod.ET (Hexdump: 45 54 20 2F 64 61 62
70 2F 31 2E 30 2F 61 64 64 3F 66 6F 72 6D 61 74 3D 6A 73 6F 6E 26 61 6C 67 6F
72 69 74 68 6D 3D 52 53 41 2D 53 48 41 32 35 36 26 61 70 70 69 64 3D 63 6F 6D
2E 6E 6F 6B 69 61 2E 64 61 62 63 2E 6A 6D 65 2E 73 34 30 2D 31 26 63 6E 6F 6E
63 65 3D 62 6E 52 6B 4D 44 46 78 64 33 45 33 56 6B 56 4E 5A 7A 52 72 59 6C 51
33 4F 58 4A 30 26 69 64 3D 77 2D 31 77 76 36 70 38 63 6E 31 6E 37 70 35 34 68
78 74 67 6E 33 72 6A 65 36 71 34 26 6E 6F 6E 63 65 3D 4D 76 43 34 52 6C 7A 45
56 63 26 72 65 61 6C 6D 3D 77 69 70 73 6C 2E 63 6F 6D 26 72 65 66 3D 42 51 49
4B 36 36 51 78 36 4D 5A 6C 56 54 79 75 58 50 71 55 75 65 54 78 78 69 73 25 32
35 33 44 26 73 69 67 6E 61 74 75 72 65 3D 6E 34 74 5A 4C 67 79 70 68 36 25 32
35 32 42 7A 30 32 61 64 74 47 78 64 4C 45 25 32 35 32 46 6F 35 56 33 57 7A 58
46 44 44 37 38 57 65 79 52 61 33 25 32 35 32 46 6D 30 56 35 47 25 32 35 32 42
46 57 53 35 38 64 4A 45 6A 35 6D 55 66 68 47 47 58 39 78 78 6C 66 45 54 64 56
42 68 56 6D 25 32 35 32 46 78 6A 53 50 46 48 73 61 48 68 61 39 33 48 56 54 50
76 68 32 51 47 33 36 58 75 69 35 55 69 76 5A 52 58 55 75 67 62 4B 25 32 35 32
42 33 63 50 46 41 6E 53 69 4C 57 6E 61 70 6A 45 55 52 6A 63 6B 50 30 66 61 45
63 63 45 71 30 58 73 44 32 4A 66 34 73 31 47 6E 4B 37 54 35 77 63 6A 61 38 75
59 25 32 35 33 44 26 74 69 6D 65 73 74 61 6D 70 3D 31 33 38 35 35 33 39 34 34
39 26 76 65 72 73 69 6F 6E 3D 31 2E 35 2E 37 20 48 54 54 50 2F 31 2E 31 0D 0A
48 6F 73 74 3A 20 6C 6F 63 61 6C 68 6F 73 74 3A 38 34 34 33 0D 0A 43 6F 6E 6E
65 63 74 69 6F 6E 3A 20 4B 65 65 70 2D 41 6C 69 76 65 0D 0A 55 73 65 72 2D 41
67 65 6E 74 3A 20 41 70 61 63 68 65 2D 48 74 74 70 43 6C 69 65 6E 74 2F 34 2E
33 20 28 6A 61 76 61 20 31 2E 35 29 0D 0A 0D 0A)
org.apache.mina.filter.codec.ProtocolDecoderException:
java.lang.IllegalArgumentException: No enum constant
org.apache.mina.http.api.HttpMethod.ET (Hexdump: 45 54 20 2F 64 61 62 70 2F 31
2E 30 2F 61 64 64 3F 66 6F 72 6D 61 74 3D 6A 73 6F 6E 26 61 6C 67 6F 72 69 74
68 6D 3D 52 53 41 2D 53 48 41 32 35 36 26 61 70 70 69 64 3D 63 6F 6D 2E 6E 6F
6B 69 61 2E 64 61 62 63 2E 6A 6D 65 2E 73 34 30 2D 31 26 63 6E 6F 6E 63 65 3D
62 6E 52 6B 4D 44 46 78 64 33 45 33 56 6B 56 4E 5A 7A 52 72 59 6C 51 33 4F 58
4A 30 26 69 64 3D 77 2D 31 77 76 36 70 38 63 6E 31 6E 37 70 35 34 68 78 74 67
6E 33 72 6A 65 36 71 34 26 6E 6F 6E 63 65 3D 4D 76 43 34 52 6C 7A 45 56 63 26
72 65 61 6C 6D 3D 77 69 70 73 6C 2E 63 6F 6D 26 72 65 66 3D 42 51 49 4B 36 36
51 78 36 4D 5A 6C 56 54 79 75 58 50 71 55 75 65 54 78 78 69 73 25 32 35 33 44
26 73 69 67 6E 61 74 75 72 65 3D 6E 34 74 5A 4C 67 79 70 68 36 25 32 35 32 42
7A 30 32 61 64 74 47 78 64 4C 45 25 32 35 32 46 6F 35 56 33 57 7A 58 46 44 44
37 38 57 65 79 52 61 33 25 32 35 32 46 6D 30 56 35 47 25 32 35 32 42 46 57 53
35 38 64 4A 45 6A 35 6D 55 66 68 47 47 58 39 78 78 6C 66 45 54 64 56 42 68 56
6D 25 32 35 32 46 78 6A 53 50 46 48 73 61 48 68 61 39 33 48 56 54 50 76 68 32
51 47 33 36 58 75 69 35 55 69 76 5A 52 58 55 75 67 62 4B 25 32 35 32 42 33 63
50 46 41 6E 53 69 4C 57 6E 61 70 6A 45 55 52 6A 63 6B 50 30 66 61 45 63 63 45
71 30 58 73 44 32 4A 66 34 73 31 47 6E 4B 37 54 35 77 63 6A 61 38 75 59 25 32
35 33 44 26 74 69 6D 65 73 74 61 6D 70 3D 31 33 38 35 35 33 39 34 34 39 26 76
65 72 73 69 6F 6E 3D 31 2E 35 2E 37 20 48 54 54 50 2F 31 2E 31 0D 0A 48 6F 73
74 3A 20 6C 6F 63 61 6C 68 6F 73 74 3A 38 34 34 33 0D 0A 43 6F 6E 6E 65 63 74
69 6F 6E 3A 20 4B 65 65 70 2D 41 6C 69 76 65 0D 0A 55 73 65 72 2D 41 67 65 6E
74 3A 20 41 70 61 63 68 65 2D 48 74 74 70 43 6C 69 65 6E 74 2F 34 2E 33 20 28
6A 61 76 61 20 31 2E 35 29 0D 0A 0D 0A)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:242)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at
org.apache.mina.filter.ssl.SslHandler.flushScheduledEvents(SslHandler.java:322)
at
org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:497)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at
org.apache.mina.filter.logging.LoggingFilter.messageReceived(LoggingFilter.java:208)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalArgumentException: No enum constant
org.apache.mina.http.api.HttpMethod.ET
at java.lang.Enum.valueOf(Enum.java:236)
at org.apache.mina.http.api.HttpMethod.valueOf(HttpMethod.java:27)
at
org.apache.mina.http.HttpServerDecoder.parseHttpRequestHead(HttpServerDecoder.java:184)
at
org.apache.mina.http.HttpServerDecoder.decode(HttpServerDecoder.java:91)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:232)
... 24 more
I don't think it is a problem of the client because we are using
org.apache.http.client.methods.HttpGet;
HttpGet httpget = new HttpGet(address);
HttpResponse response = httpclient.execute(httpget);
Any idea what is going on?
Thanks,
-Enrique