* Disabled chunked encoding for RTSP
* Added RTSP encoders
This commit is contained in:
parent
829114c37f
commit
bb0c1e139f
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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');
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user