diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageDecoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageDecoder.java
new file mode 100644
index 0000000000..d5cce5b35f
--- /dev/null
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageDecoder.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * Red Hat 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.rtsp;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
+import org.jboss.netty.handler.codec.frame.TooLongFrameException;
+import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
+import org.jboss.netty.handler.codec.http.HttpMessage;
+import org.jboss.netty.handler.codec.http.HttpMessageDecoder;
+
+/**
+ * Decodes {@link ChannelBuffer}s into RTSP messages represented in
+ * {@link HttpMessage}s.
+ *
+ *
Parameters that prevents excessive memory consumption
+ *
+ *
+ * Name | Meaning |
+ *
+ *
+ * {@code maxInitialLineLength} |
+ * The maximum length of the initial line
+ * (e.g. {@code "SETUP / RTSP/1.0"} or {@code "RTSP/1.0 200 OK"})
+ * If the length of the initial line exceeds this value, a
+ * {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxHeaderSize} |
+ * The maximum length of all headers. If the sum of the length of each
+ * header exceeds this value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxContentLength} |
+ * The maximum length of the content. If the content length exceeds this
+ * value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
+ *
+ * @author The Netty Project
+ * @author Amit Bhayani
+ * @author Trustin Lee
+ * @version $Rev$, $Date$
+ */
+public abstract class RtspMessageDecoder extends HttpMessageDecoder {
+
+ private final DecoderEmbedder aggregator;
+
+ /**
+ * Creates a new instance with the default
+ * {@code maxInitialLineLength (4096}}, {@code maxHeaderSize (8192)}, and
+ * {@code maxContentLength (8192)}.
+ */
+ protected RtspMessageDecoder() {
+ this(4096, 8192, 8192);
+ }
+
+ /**
+ * Creates a new instance with the specified parameters.
+ */
+ protected RtspMessageDecoder(int maxInitialLineLength, int maxHeaderSize, int maxContentLength) {
+ super(maxInitialLineLength, maxHeaderSize, maxContentLength * 2);
+ aggregator = new DecoderEmbedder(new HttpChunkAggregator(maxContentLength));
+ }
+
+ @Override
+ protected Object decode(ChannelHandlerContext ctx, Channel channel,
+ ChannelBuffer buffer, State state) throws Exception {
+ Object o = super.decode(ctx, channel, buffer, state);
+ if (o != null && aggregator.offer(o)) {
+ return aggregator.poll();
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageEncoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageEncoder.java
new file mode 100644
index 0000000000..572eae0089
--- /dev/null
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspMessageEncoder.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * Red Hat 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.rtsp;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.handler.codec.http.HttpMessage;
+import org.jboss.netty.handler.codec.http.HttpMessageEncoder;
+
+/**
+ * Encodes an RTSP message represented in {@link HttpMessage} into
+ * a {@link ChannelBuffer}.
+
+ * @author The Netty Project
+ * @author Amit Bhayani
+ * @author Trustin Lee
+ * @version $Rev$, $Date$
+ */
+public abstract class RtspMessageEncoder extends HttpMessageEncoder {
+
+ /**
+ * Creates a new instance.
+ */
+ protected RtspMessageEncoder() {
+ super();
+ }
+
+ @Override
+ protected Object encode(ChannelHandlerContext ctx, Channel channel,
+ Object msg) throws Exception {
+ // Ignore unrelated message types such as HttpChunk.
+ if (!(msg instanceof HttpMessage)) {
+ return msg;
+ }
+ return super.encode(ctx, channel, msg);
+ }
+}
diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestDecoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestDecoder.java
index 3288994c2e..2313e44c17 100644
--- a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestDecoder.java
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestDecoder.java
@@ -16,29 +16,49 @@
package org.jboss.netty.handler.codec.rtsp;
import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.handler.codec.frame.TooLongFrameException;
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
import org.jboss.netty.handler.codec.http.HttpMessage;
-import org.jboss.netty.handler.codec.http.HttpMessageDecoder;
import org.jboss.netty.handler.codec.http.HttpRequest;
/**
- * Decodes {@link ChannelBuffer}s into {@link HttpRequest}s whose method is
- * {@link RtspMethods} and protocol version is {@link RtspVersions}.
+ * Decodes {@link ChannelBuffer}s into RTSP requests represented in
+ * {@link HttpRequest}s.
*
- * Please refer to {@link HttpMessageDecoder} for the detailed information on
- * how this decoder works and what parameters are available.
- *
+ *
Parameters that prevents excessive memory consumption
+ *
+ *
+ * Name | Meaning |
+ *
+ *
+ * {@code maxInitialLineLength} |
+ * The maximum length of the initial line (e.g. {@code "SETUP / RTSP/1.0"})
+ * If the length of the initial line exceeds this value, a
+ * {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxHeaderSize} |
+ * The maximum length of all headers. If the sum of the length of each
+ * header exceeds this value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxContentLength} |
+ * The maximum length of the content. If the content length exceeds this
+ * value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * *
* @author The Netty Project
* @author Amit Bhayani
* @author Trustin Lee
* @version $Rev$, $Date$
*/
-public class RtspRequestDecoder extends HttpMessageDecoder {
+public class RtspRequestDecoder extends RtspMessageDecoder {
/**
* Creates a new instance with the default
* {@code maxInitialLineLength (4096}}, {@code maxHeaderSize (8192)}, and
- * {@code maxChunkSize (8192)}.
+ * {@code maxContentLength (8192)}.
*/
public RtspRequestDecoder() {
super();
@@ -47,9 +67,8 @@ public class RtspRequestDecoder extends HttpMessageDecoder {
/**
* Creates a new instance with the specified parameters.
*/
- public RtspRequestDecoder(int maxInitialLineLength, int maxHeaderSize,
- int maxChunkSize) {
- super(maxInitialLineLength, maxHeaderSize, maxChunkSize);
+ public RtspRequestDecoder(int maxInitialLineLength, int maxHeaderSize, int maxContentLength) {
+ super(maxInitialLineLength, maxHeaderSize, maxContentLength);
}
@Override
diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestEncoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestEncoder.java
new file mode 100644
index 0000000000..75a37e40cc
--- /dev/null
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspRequestEncoder.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * Red Hat 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.rtsp;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.handler.codec.http.HttpMessage;
+import org.jboss.netty.handler.codec.http.HttpRequest;
+
+/**
+ * Encodes an RTSP request represented in {@link HttpRequest} into
+ * a {@link ChannelBuffer}.
+
+ * @author The Netty Project
+ * @author Amit Bhayani
+ * @author Trustin Lee
+ * @version $Rev$, $Date$
+ */
+public class RtspRequestEncoder extends RtspMessageEncoder {
+
+ @Override
+ protected void encodeInitialLine(ChannelBuffer buf, HttpMessage message)
+ throws Exception {
+ HttpRequest request = (HttpRequest) message;
+ buf.writeBytes(request.getMethod().toString().getBytes("ASCII"));
+ buf.writeByte((byte) ' ');
+ buf.writeBytes(request.getUri().getBytes("ASCII"));
+ buf.writeByte((byte) ' ');
+ buf.writeBytes(request.getProtocolVersion().toString().getBytes("ASCII"));
+ buf.writeByte((byte) '\r');
+ buf.writeByte((byte) '\n');
+ }
+}
diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseDecoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseDecoder.java
index 37ae367201..7f9e6666c0 100644
--- a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseDecoder.java
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseDecoder.java
@@ -16,30 +16,49 @@
package org.jboss.netty.handler.codec.rtsp;
import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
+import org.jboss.netty.handler.codec.frame.TooLongFrameException;
+import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
import org.jboss.netty.handler.codec.http.HttpMessage;
-import org.jboss.netty.handler.codec.http.HttpMessageDecoder;
import org.jboss.netty.handler.codec.http.HttpResponse;
-import org.jboss.netty.handler.codec.http.HttpResponseStatus;
/**
- * Decodes {@link ChannelBuffer}s into {@link HttpResponse}s whose status is
- * {@link RtspResponseStatuses} and protocol version is {@link RtspVersions}.
+ * Decodes {@link ChannelBuffer}s into RTSP responses represented in
+ * {@link HttpResponse}s.
*
- * Please refer to {@link HttpMessageDecoder} for the detailed information on
- * how this decoder works and what parameters are available.
+ *
Parameters that prevents excessive memory consumption
+ *
+ *
+ * Name | Meaning |
+ *
+ *
+ * {@code maxInitialLineLength} |
+ * The maximum length of the initial line (e.g. {@code "RTSP/1.0 200 OK"})
+ * If the length of the initial line exceeds this value, a
+ * {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxHeaderSize} |
+ * The maximum length of all headers. If the sum of the length of each
+ * header exceeds this value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
+ * {@code maxContentLength} |
+ * The maximum length of the content. If the content length exceeds this
+ * value, a {@link TooLongFrameException} will be raised. |
+ *
+ *
*
* @author The Netty Project
* @author Amit Bhayani
* @author Trustin Lee
* @version $Rev$, $Date$
*/
-public class RtspResponseDecoder extends HttpMessageDecoder {
+public class RtspResponseDecoder extends RtspMessageDecoder {
/**
* Creates a new instance with the default
* {@code maxInitialLineLength (4096}}, {@code maxHeaderSize (8192)}, and
- * {@code maxChunkSize (8192)}.
+ * {@code maxContentLength (8192)}.
*/
public RtspResponseDecoder() {
super();
@@ -49,20 +68,18 @@ public class RtspResponseDecoder extends HttpMessageDecoder {
* Creates a new instance with the specified parameters.
*/
public RtspResponseDecoder(int maxInitialLineLength, int maxHeaderSize,
- int maxChunkSize) {
- super(maxInitialLineLength, maxHeaderSize, maxChunkSize);
+ int maxContentLength) {
+ super(maxInitialLineLength, maxHeaderSize, maxContentLength);
}
@Override
protected HttpMessage createMessage(String[] initialLine) throws Exception {
- return new DefaultHttpResponse(
- RtspVersions.valueOf(initialLine[0]),
- new HttpResponseStatus(Integer.valueOf(initialLine[1]),initialLine[2]));
+ return new DefaultHttpRequest(RtspVersions.valueOf(initialLine[2]),
+ RtspMethods.valueOf(initialLine[0]), initialLine[1]);
}
@Override
protected boolean isDecodingRequest() {
- return false;
+ return true;
}
-
}
diff --git a/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseEncoder.java b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseEncoder.java
new file mode 100644
index 0000000000..7b5c8b3ec3
--- /dev/null
+++ b/src/main/java/org/jboss/netty/handler/codec/rtsp/RtspResponseEncoder.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ *
+ * Red Hat 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.rtsp;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.handler.codec.http.HttpMessage;
+import org.jboss.netty.handler.codec.http.HttpResponse;
+
+/**
+ * Encodes an RTSP response represented in {@link HttpResponse} into
+ * a {@link ChannelBuffer}.
+
+ * @author The Netty Project
+ * @author Amit Bhayani
+ * @author Trustin Lee
+ * @version $Rev$, $Date$
+ */
+public class RtspResponseEncoder extends RtspMessageEncoder {
+
+ @Override
+ protected void encodeInitialLine(ChannelBuffer buf, HttpMessage message)
+ throws Exception {
+ HttpResponse response = (HttpResponse) message;
+ buf.writeBytes(response.getProtocolVersion().toString().getBytes("ASCII"));
+ buf.writeByte((byte) ' ');
+ buf.writeBytes(String.valueOf(response.getStatus().getCode()).getBytes("ASCII"));
+ buf.writeByte((byte) ' ');
+ buf.writeBytes(String.valueOf(response.getStatus().getReasonPhrase()).getBytes("ASCII"));
+ buf.writeByte((byte) '\r');
+ buf.writeByte((byte) '\n');
+ }
+}