* Disabled chunked encoding for RTSP

* Added RTSP encoders
This commit is contained in:
Trustin Lee 2010-02-01 08:28:17 +00:00
parent 829114c37f
commit bb0c1e139f
6 changed files with 295 additions and 27 deletions

View File

@ -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.
* <p>
* <h3>Parameters that prevents excessive memory consumption</h3>
* <table border="1">
* <tr>
* <th>Name</th><th>Meaning</th>
* </tr>
* <tr>
* <td>{@code maxInitialLineLength}</td>
* <td>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.</td>
* </tr>
* <tr>
* <td>{@code maxHeaderSize}</td>
* <td>The maximum length of all headers. If the sum of the length of each
* header exceeds this value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* <tr>
* <td>{@code maxContentLength}</td>
* <td>The maximum length of the content. If the content length exceeds this
* value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* </table>
*
* @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @version $Rev$, $Date$
*/
public abstract class RtspMessageDecoder extends HttpMessageDecoder {
private final DecoderEmbedder<HttpMessage> 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<HttpMessage>(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;
}
}
}

View File

@ -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 <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @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);
}
}

View File

@ -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.
* <p>
* Please refer to {@link HttpMessageDecoder} for the detailed information on
* how this decoder works and what parameters are available.
*
* <h3>Parameters that prevents excessive memory consumption</h3>
* <table border="1">
* <tr>
* <th>Name</th><th>Meaning</th>
* </tr>
* <tr>
* <td>{@code maxInitialLineLength}</td>
* <td>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.</td>
* </tr>
* <tr>
* <td>{@code maxHeaderSize}</td>
* <td>The maximum length of all headers. If the sum of the length of each
* header exceeds this value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* <tr>
* <td>{@code maxContentLength}</td>
* <td>The maximum length of the content. If the content length exceeds this
* value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* </table>
* *
* @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @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

View File

@ -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 <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @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');
}
}

View File

@ -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.
* <p>
* Please refer to {@link HttpMessageDecoder} for the detailed information on
* how this decoder works and what parameters are available.
* <h3>Parameters that prevents excessive memory consumption</h3>
* <table border="1">
* <tr>
* <th>Name</th><th>Meaning</th>
* </tr>
* <tr>
* <td>{@code maxInitialLineLength}</td>
* <td>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.</td>
* </tr>
* <tr>
* <td>{@code maxHeaderSize}</td>
* <td>The maximum length of all headers. If the sum of the length of each
* header exceeds this value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* <tr>
* <td>{@code maxContentLength}</td>
* <td>The maximum length of the content. If the content length exceeds this
* value, a {@link TooLongFrameException} will be raised.</td>
* </tr>
* </table>
*
* @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @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;
}
}

View File

@ -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 <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author <a href="http://amitbhayani.blogspot.com/">Amit Bhayani</a>
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @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');
}
}