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

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameMeaning
{@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

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameMeaning
{@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

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
NameMeaning
{@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'); + } +}