Fit to 120 columns (in progress)
This commit is contained in:
parent
255a0721bd
commit
90a1bd6965
@ -39,11 +39,10 @@ import java.nio.charset.UnsupportedCharsetException;
|
||||
* <h3>Random Access Indexing</h3>
|
||||
*
|
||||
* Just like an ordinary primitive byte array, {@link ChannelBuffer} uses
|
||||
* <a href="http://en.wikipedia.org/wiki/Index_(information_technology)#Array_element_identifier">zero-based indexing</a>.
|
||||
* It means the index of the first byte is always {@code 0} and the index of
|
||||
* the last byte is always {@link #capacity() capacity - 1}. For example, to
|
||||
* iterate all bytes of a buffer, you can do the following, regardless of
|
||||
* its internal implementation:
|
||||
* <a href="http://en.wikipedia.org/wiki/Zero-based_numbering">zero-based indexing</a>.
|
||||
* It means the index of the first byte is always {@code 0} and the index of the last byte is
|
||||
* always {@link #capacity() capacity - 1}. For example, to iterate all bytes of a buffer, you
|
||||
* can do the following, regardless of its internal implementation:
|
||||
*
|
||||
* <pre>
|
||||
* {@link ChannelBuffer} buffer = ...;
|
||||
|
@ -59,7 +59,8 @@ package org.jboss.netty.channel;
|
||||
* <p>
|
||||
* <strong>Caution:</strong>
|
||||
* <p>
|
||||
* Use the *Later(..) methods of the {@link Channels} class if you want to send an upstream event from a {@link ChannelDownstreamHandler} otherwise you may run into threading issues.
|
||||
* Use the *Later(..) methods of the {@link Channels} class if you want to send an upstream event
|
||||
* from a {@link ChannelDownstreamHandler} otherwise you may run into threading issues.
|
||||
*
|
||||
* <h3>State management</h3>
|
||||
*
|
||||
|
@ -71,7 +71,8 @@ import org.jboss.netty.channel.socket.ServerSocketChannel;
|
||||
* <td>{@code "channelOpen"}</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#OPEN OPEN}, value = {@code true})</td>
|
||||
* <td>a {@link Channel} is open, but not bound nor connected</td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@code "channelClosed"}</td>
|
||||
@ -82,7 +83,8 @@ import org.jboss.netty.channel.socket.ServerSocketChannel;
|
||||
* <td>{@code "channelBound"}</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#BOUND BOUND}, value = {@link SocketAddress})</td>
|
||||
* <td>a {@link Channel} is open and bound to a local address, but not connected.</td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@code "channelUnbound"}</td>
|
||||
@ -91,9 +93,11 @@ import org.jboss.netty.channel.socket.ServerSocketChannel;
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@code "channelConnected"}</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#CONNECTED CONNECTED}, value =
|
||||
* {@link SocketAddress})</td>
|
||||
* <td>a {@link Channel} is open, bound to a local address, and connected to a remote address</td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* <td><strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@code "writeComplete"}</td>
|
||||
@ -153,7 +157,8 @@ import org.jboss.netty.channel.socket.ServerSocketChannel;
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>{@code "connect"}</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})</td>
|
||||
* <td>{@link ChannelStateEvent}<br/>(state = {@link ChannelState#CONNECTED CONNECTED}, value =
|
||||
* {@link SocketAddress})</td>
|
||||
* <td>Connect the {@link Channel} to the specified remote address.</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
|
@ -142,7 +142,7 @@ import org.jboss.netty.channel.group.ChannelGroup;
|
||||
* <pre>
|
||||
* public final class DataServerState {
|
||||
*
|
||||
* <b>public static final {@link ChannelLocal}<Boolean> loggedIn = new {@link ChannelLocal}<Boolean>() {
|
||||
* <b>public static final {@link ChannelLocal}<Boolean> loggedIn = new {@link ChannelLocal}<>() {
|
||||
* protected Boolean initialValue(Channel channel) {
|
||||
* return false;
|
||||
* }
|
||||
|
@ -48,7 +48,8 @@ public class ChannelLocal<T> implements Iterable<Entry<Channel, T>> {
|
||||
private final boolean removeOnClose;
|
||||
|
||||
/**
|
||||
* Creates a {@link Channel} local variable by calling {@link #ChannelLocal(boolean)} with <code>false</code> as parameter
|
||||
* Creates a {@link Channel} local variable by calling {@link #ChannelLocal(boolean)} with
|
||||
* <code>false</code> as parameter
|
||||
*/
|
||||
public ChannelLocal() {
|
||||
this(false);
|
||||
@ -57,7 +58,8 @@ public class ChannelLocal<T> implements Iterable<Entry<Channel, T>> {
|
||||
/**
|
||||
* Creates a {@link Channel} local variable.
|
||||
*
|
||||
* @param removeOnClose if <code>true</code> the {@link ChannelLocal} will remove a {@link Channel} from it own once the {@link Channel} was closed.
|
||||
* @param removeOnClose if <code>true</code> the {@link ChannelLocal} will remove a
|
||||
* {@link Channel} from it own once the {@link Channel} was closed.
|
||||
*/
|
||||
public ChannelLocal(boolean removeOnClose) {
|
||||
this.removeOnClose = removeOnClose;
|
||||
|
@ -168,7 +168,8 @@ import org.jboss.netty.handler.ssl.SslHandler;
|
||||
* {@link ChannelPipeline} pipeline = {@link Channels#pipeline() Channels.pipeline()};
|
||||
* pipeline.addLast("decoder", new MyProtocolDecoder());
|
||||
* pipeline.addLast("encoder", new MyProtocolEncoder());
|
||||
* pipeline.addLast("executor", new {@link ExecutionHandler}(new {@link OrderedMemoryAwareThreadPoolExecutor}(16, 1048576, 1048576)));
|
||||
* pipeline.addLast("executor", new {@link ExecutionHandler}(
|
||||
* new {@link OrderedMemoryAwareThreadPoolExecutor}(16, 1048576, 1048576)));
|
||||
* pipeline.addLast("handler", new MyBusinessLogicHandler());
|
||||
* </pre>
|
||||
*
|
||||
|
@ -52,7 +52,8 @@ import java.net.SocketAddress;
|
||||
* <p>
|
||||
* <strong>Caution:</strong>
|
||||
* <p>
|
||||
* Use the *Later(..) methods of the {@link Channels} class if you want to send an upstream event from a {@link ChannelDownstreamHandler} otherwise you may run into threading issues.
|
||||
* Use the *Later(..) methods of the {@link Channels} class if you want to send an upstream event
|
||||
* from a {@link ChannelDownstreamHandler} otherwise you may run into threading issues.
|
||||
*
|
||||
*/
|
||||
public class SimpleChannelDownstreamHandler implements ChannelDownstreamHandler {
|
||||
|
@ -147,7 +147,8 @@ public class SimpleChannelUpstreamHandler implements ChannelUpstreamHandler {
|
||||
* Invoked when a {@link Channel} is open, but not bound nor connected.
|
||||
* <br/>
|
||||
*
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
*/
|
||||
public void channelOpen(
|
||||
ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
|
||||
@ -159,7 +160,8 @@ public class SimpleChannelUpstreamHandler implements ChannelUpstreamHandler {
|
||||
* but not connected.
|
||||
* <br/>
|
||||
*
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
*/
|
||||
public void channelBound(
|
||||
ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
|
||||
@ -171,7 +173,8 @@ public class SimpleChannelUpstreamHandler implements ChannelUpstreamHandler {
|
||||
* connected to a remote address.
|
||||
* <br/>
|
||||
*
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
* <strong>Be aware that this event is fired from within the Boss-Thread so you should not
|
||||
* execute any heavy operation in there as it will block the dispatching to other workers!</strong>
|
||||
*/
|
||||
public void channelConnected(
|
||||
ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
|
||||
|
@ -138,7 +138,8 @@ public class HttpStaticFileServerHandler extends SimpleChannelUpstreamHandler {
|
||||
SimpleDateFormat dateFormatter = new SimpleDateFormat(HTTP_DATE_FORMAT, Locale.US);
|
||||
Date ifModifiedSinceDate = dateFormatter.parse(ifModifiedSince);
|
||||
|
||||
// Only compare up to the second because the datetime format we send to the client does not have milliseconds
|
||||
// Only compare up to the second because the datetime format we send to the client does
|
||||
// not have milliseconds
|
||||
long ifModifiedSinceDateSeconds = ifModifiedSinceDate.getTime() / 1000;
|
||||
long fileLastModifiedSeconds = file.lastModified() / 1000;
|
||||
if (ifModifiedSinceDateSeconds == fileLastModifiedSeconds) {
|
||||
@ -297,7 +298,8 @@ public class HttpStaticFileServerHandler extends SimpleChannelUpstreamHandler {
|
||||
time.add(Calendar.SECOND, HTTP_CACHE_SECONDS);
|
||||
response.setHeader(HttpHeaders.Names.EXPIRES, dateFormatter.format(time.getTime()));
|
||||
response.setHeader(HttpHeaders.Names.CACHE_CONTROL, "private, max-age=" + HTTP_CACHE_SECONDS);
|
||||
response.setHeader(HttpHeaders.Names.LAST_MODIFIED, dateFormatter.format(new Date(fileToCache.lastModified())));
|
||||
response.setHeader(
|
||||
HttpHeaders.Names.LAST_MODIFIED, dateFormatter.format(new Date(fileToCache.lastModified())));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -132,7 +132,8 @@ public class HttpSnoopServerHandler extends SimpleChannelUpstreamHandler {
|
||||
if (keepAlive) {
|
||||
// Add 'Content-Length' header only for a keep-alive connection.
|
||||
response.setHeader(CONTENT_LENGTH, response.getContent().readableBytes());
|
||||
// Add keep alive header as per http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
|
||||
// Add keep alive header as per:
|
||||
// - http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection
|
||||
response.setHeader(CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
|
||||
}
|
||||
|
||||
|
@ -430,7 +430,8 @@ public class HttpUploadServerHandler extends SimpleChannelUpstreamHandler {
|
||||
responseContent
|
||||
.append("<tr><td>Fill with value: <br> <textarea name=\"thirdinfo\" cols=40 rows=10></textarea>");
|
||||
responseContent
|
||||
.append("<tr><td>Fill with file (only file name will be transmitted): <br> <input type=file name=\"myfile\">");
|
||||
.append("<tr><td>Fill with file (only file name will be transmitted): <br> " +
|
||||
"<input type=file name=\"myfile\">");
|
||||
responseContent.append("</td></tr>");
|
||||
responseContent
|
||||
.append("<tr><td><INPUT TYPE=\"submit\" NAME=\"Send\" VALUE=\"Send\"></INPUT></td>");
|
||||
|
@ -27,67 +27,50 @@ public final class WebSocketServerIndexPage {
|
||||
private static final String NEWLINE = "\r\n";
|
||||
|
||||
public static ChannelBuffer getContent(String webSocketLocation) {
|
||||
return ChannelBuffers
|
||||
.copiedBuffer(
|
||||
"<html><head><title>Web Socket Test</title></head>"
|
||||
+ NEWLINE
|
||||
+ "<body>"
|
||||
+ NEWLINE
|
||||
+ "<script type=\"text/javascript\">"
|
||||
+ NEWLINE
|
||||
+ "var socket;"
|
||||
+ NEWLINE
|
||||
+ "if (!window.WebSocket) {"
|
||||
+ NEWLINE
|
||||
+ " window.WebSocket = window.MozWebSocket;"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ "if (window.WebSocket) {"
|
||||
+ NEWLINE
|
||||
+ " socket = new WebSocket(\""
|
||||
+ webSocketLocation
|
||||
+ "\");"
|
||||
+ NEWLINE
|
||||
+ " socket.onmessage = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + '\\n' + event.data };"
|
||||
+ NEWLINE
|
||||
+ " socket.onopen = function(event) { var ta = document.getElementById('responseText'); ta.value = \"Web Socket opened!\"; };"
|
||||
+ NEWLINE
|
||||
+ " socket.onclose = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + \"Web Socket closed\"; };"
|
||||
+ NEWLINE
|
||||
+ "} else {"
|
||||
+ NEWLINE
|
||||
+ " alert(\"Your browser does not support Web Socket.\");"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ NEWLINE
|
||||
+ "function send(message) {"
|
||||
+ NEWLINE
|
||||
+ " if (!window.WebSocket) { return; }"
|
||||
+ NEWLINE
|
||||
+ " if (socket.readyState == WebSocket.OPEN) {"
|
||||
+ NEWLINE
|
||||
+ " socket.send(message);"
|
||||
+ NEWLINE
|
||||
+ " } else {"
|
||||
+ NEWLINE
|
||||
+ " alert(\"The socket is not open.\");"
|
||||
+ NEWLINE
|
||||
+ " }"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ "</script>"
|
||||
+ NEWLINE
|
||||
+ "<form onsubmit=\"return false;\">"
|
||||
+ NEWLINE
|
||||
+ "<input type=\"text\" name=\"message\" value=\"Hello, World!\"/>"
|
||||
+ "<input type=\"button\" value=\"Send Web Socket Data\" onclick=\"send(this.form.message.value)\" />"
|
||||
+ NEWLINE + "<h3>Output</h3>" + NEWLINE
|
||||
+ "<textarea id=\"responseText\" style=\"width: 500px; height:300px;\"></textarea>"
|
||||
+ NEWLINE + "</form>" + NEWLINE + "</body>" + NEWLINE + "</html>" + NEWLINE,
|
||||
CharsetUtil.US_ASCII);
|
||||
return ChannelBuffers.copiedBuffer(
|
||||
"<html><head><title>Web Socket Test</title></head>" + NEWLINE +
|
||||
"<body>" + NEWLINE +
|
||||
"<script type=\"text/javascript\">" + NEWLINE +
|
||||
"var socket;" + NEWLINE +
|
||||
"if (!window.WebSocket) {" + NEWLINE +
|
||||
" window.WebSocket = window.MozWebSocket;" + NEWLINE +
|
||||
"}" + NEWLINE +
|
||||
"if (window.WebSocket) {" + NEWLINE +
|
||||
" socket = new WebSocket(\"" + webSocketLocation + "\");" + NEWLINE +
|
||||
" socket.onmessage = function(event) {" + NEWLINE +
|
||||
" var ta = document.getElementById('responseText');" + NEWLINE +
|
||||
" ta.value = ta.value + '\\n' + event.data" + NEWLINE +
|
||||
" };" + NEWLINE +
|
||||
" socket.onopen = function(event) {" + NEWLINE +
|
||||
" var ta = document.getElementById('responseText');" + NEWLINE +
|
||||
" ta.value = \"Web Socket opened!\";" + NEWLINE +
|
||||
" };" + NEWLINE +
|
||||
" socket.onclose = function(event) {" + NEWLINE +
|
||||
" var ta = document.getElementById('responseText');" + NEWLINE +
|
||||
" ta.value = ta.value + \"Web Socket closed\"; " + NEWLINE +
|
||||
" };" + NEWLINE +
|
||||
"} else {" + NEWLINE +
|
||||
" alert(\"Your browser does not support Web Socket.\");" + NEWLINE +
|
||||
"}" + NEWLINE +
|
||||
NEWLINE +
|
||||
"function send(message) {" + NEWLINE +
|
||||
" if (!window.WebSocket) { return; }" + NEWLINE +
|
||||
" if (socket.readyState == WebSocket.OPEN) {" + NEWLINE +
|
||||
" socket.send(message);" + NEWLINE +
|
||||
" } else {" + NEWLINE +
|
||||
" alert(\"The socket is not open.\");" + NEWLINE +
|
||||
" }" + NEWLINE +
|
||||
"}" + NEWLINE +
|
||||
"</script>" + NEWLINE +
|
||||
"<form onsubmit=\"return false;\">" + NEWLINE +
|
||||
"<input type=\"text\" name=\"message\" value=\"Hello, World!\"/>" +
|
||||
"<input type=\"button\" value=\"Send Web Socket Data\"" + NEWLINE +
|
||||
" onclick=\"send(this.form.message.value)\" />" + NEWLINE +
|
||||
"<h3>Output</h3>" + NEWLINE +
|
||||
"<textarea id=\"responseText\" style=\"width:500px;height:300px;\"></textarea>" + NEWLINE +
|
||||
"</form>" + NEWLINE +
|
||||
"</body>" + NEWLINE +
|
||||
"</html>" + NEWLINE, CharsetUtil.US_ASCII);
|
||||
}
|
||||
|
||||
private WebSocketServerIndexPage() {
|
||||
|
@ -29,6 +29,7 @@ import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.channel.ExceptionEvent;
|
||||
import org.jboss.netty.channel.MessageEvent;
|
||||
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
|
||||
import org.jboss.netty.example.http.websocketx.server.WebSocketServerIndexPage;
|
||||
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
|
||||
import org.jboss.netty.handler.codec.http.HttpHeaders;
|
||||
import org.jboss.netty.handler.codec.http.HttpRequest;
|
||||
@ -75,7 +76,7 @@ public class WebSocketSslServerHandler extends SimpleChannelUpstreamHandler {
|
||||
if (req.getUri().equals("/")) {
|
||||
HttpResponse res = new DefaultHttpResponse(HTTP_1_1, OK);
|
||||
|
||||
ChannelBuffer content = WebSocketSslServerIndexPage.getContent(getWebSocketLocation(req));
|
||||
ChannelBuffer content = WebSocketServerIndexPage.getContent(getWebSocketLocation(req));
|
||||
|
||||
res.setHeader(CONTENT_TYPE, "text/html; charset=UTF-8");
|
||||
setContentLength(res, content.readableBytes());
|
||||
|
@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012 The Netty Project
|
||||
*
|
||||
* The Netty Project 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.example.http.websocketx.sslserver;
|
||||
|
||||
import org.jboss.netty.buffer.ChannelBuffer;
|
||||
import org.jboss.netty.buffer.ChannelBuffers;
|
||||
import org.jboss.netty.util.CharsetUtil;
|
||||
|
||||
/**
|
||||
* Generates the demo HTML page which is served at http://localhost:8080/
|
||||
*/
|
||||
public final class WebSocketSslServerIndexPage {
|
||||
|
||||
private static final String NEWLINE = "\r\n";
|
||||
|
||||
public static ChannelBuffer getContent(String webSocketLocation) {
|
||||
return ChannelBuffers
|
||||
.copiedBuffer(
|
||||
"<html><head><title>Web Socket Test</title></head>"
|
||||
+ NEWLINE
|
||||
+ "<body>"
|
||||
+ NEWLINE
|
||||
+ "<script type=\"text/javascript\">"
|
||||
+ NEWLINE
|
||||
+ "var socket;"
|
||||
+ NEWLINE
|
||||
+ "if (!window.WebSocket) {"
|
||||
+ NEWLINE
|
||||
+ " window.WebSocket = window.MozWebSocket;"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ "if (window.WebSocket) {"
|
||||
+ NEWLINE
|
||||
+ " socket = new WebSocket(\""
|
||||
+ webSocketLocation
|
||||
+ "\");"
|
||||
+ NEWLINE
|
||||
+ " socket.onmessage = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + '\\n' + event.data };"
|
||||
+ NEWLINE
|
||||
+ " socket.onopen = function(event) { var ta = document.getElementById('responseText'); ta.value = \"Web Socket opened!\"; };"
|
||||
+ NEWLINE
|
||||
+ " socket.onclose = function(event) { var ta = document.getElementById('responseText'); ta.value = ta.value + \"Web Socket closed\"; };"
|
||||
+ NEWLINE
|
||||
+ "} else {"
|
||||
+ NEWLINE
|
||||
+ " alert(\"Your browser does not support Web Socket.\");"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ NEWLINE
|
||||
+ "function send(message) {"
|
||||
+ NEWLINE
|
||||
+ " if (!window.WebSocket) { return; }"
|
||||
+ NEWLINE
|
||||
+ " if (socket.readyState == WebSocket.OPEN) {"
|
||||
+ NEWLINE
|
||||
+ " socket.send(message);"
|
||||
+ NEWLINE
|
||||
+ " } else {"
|
||||
+ NEWLINE
|
||||
+ " alert(\"The socket is not open.\");"
|
||||
+ NEWLINE
|
||||
+ " }"
|
||||
+ NEWLINE
|
||||
+ "}"
|
||||
+ NEWLINE
|
||||
+ "</script>"
|
||||
+ NEWLINE
|
||||
+ "<form onsubmit=\"return false;\">"
|
||||
+ NEWLINE
|
||||
+ "<input type=\"text\" name=\"message\" value=\"Hello, World!\"/>"
|
||||
+ "<input type=\"button\" value=\"Send Web Socket Data\" onclick=\"send(this.form.message.value)\" />"
|
||||
+ NEWLINE + "<h3>Output</h3>" + NEWLINE
|
||||
+ "<textarea id=\"responseText\" style=\"width: 500px; height:300px;\"></textarea>"
|
||||
+ NEWLINE + "</form>" + NEWLINE + "</body>" + NEWLINE + "</html>" + NEWLINE,
|
||||
CharsetUtil.US_ASCII);
|
||||
}
|
||||
|
||||
private WebSocketSslServerIndexPage() {
|
||||
// Unused
|
||||
}
|
||||
}
|
@ -34,7 +34,7 @@ import org.jboss.netty.util.CharsetUtil;
|
||||
* A UDP broadcast client that asks for a quote of the moment (QOTM) to
|
||||
* {@link QuoteOfTheMomentServer}.
|
||||
*
|
||||
* Inspired by <a href="http://java.sun.com/docs/books/tutorial/networking/datagrams/clientServer.html">the official Java tutorial</a>.
|
||||
* Inspired by <a href="http://goo.gl/BsXVR">the official Java tutorial</a>.
|
||||
*/
|
||||
public class QuoteOfTheMomentClient {
|
||||
|
||||
|
@ -32,7 +32,7 @@ import org.jboss.netty.util.CharsetUtil;
|
||||
* A UDP server that responds to the QOTM (quote of the moment) request to a
|
||||
* {@link QuoteOfTheMomentClient}.
|
||||
*
|
||||
* Inspired by <a href="http://java.sun.com/docs/books/tutorial/networking/datagrams/clientServer.html">the official Java tutorial</a>.
|
||||
* Inspired by <a href="http://goo.gl/BsXVR">the official Java tutorial</a>.
|
||||
*/
|
||||
public class QuoteOfTheMomentServer {
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
package org.jboss.netty.example.securechat;
|
||||
|
||||
import java.security.KeyStore;
|
||||
import java.security.SecureRandom;
|
||||
import java.security.Security;
|
||||
|
||||
import javax.net.ssl.KeyManager;
|
||||
@ -42,10 +43,10 @@ import org.jboss.netty.handler.ssl.SslHandler;
|
||||
* {@link SslHandler}.</li>
|
||||
* <li>When initializing an {@link SSLContext} on the client side,
|
||||
* specify the {@link KeyManager} that contains the client certificate as
|
||||
* the first argument of {@link SSLContext#init(KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom)}.</li>
|
||||
* the first argument of {@link SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}.</li>
|
||||
* <li>When initializing an {@link SSLContext} on the server side,
|
||||
* specify the proper {@link TrustManager} as the second argument of
|
||||
* {@link SSLContext#init(KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom)}
|
||||
* {@link SSLContext#init(KeyManager[], TrustManager[], SecureRandom)}
|
||||
* to validate the client certificate.</li>
|
||||
* </ul>
|
||||
*/
|
||||
|
@ -28,7 +28,9 @@ import org.jboss.netty.buffer.HeapChannelBufferFactory;
|
||||
* <a href="http://en.wikipedia.org/wiki/Base64">Base64</a> notation.
|
||||
* <p>
|
||||
* The encoding and decoding algorithm in this class has been derived from
|
||||
* <a href="http://iharder.sourceforge.net/current/java/base64/">Robert Harder's Public Domain Base64 Encoder/Decoder</a>.
|
||||
* <a href="http://iharder.sourceforge.net/current/java/base64/">Robert Harder's Public Domain
|
||||
* Base64 Encoder/Decoder</a>.
|
||||
*
|
||||
* @apiviz.landmark
|
||||
* @apiviz.uses org.jboss.netty.handler.codec.base64.Base64Dialect
|
||||
*/
|
||||
@ -125,7 +127,8 @@ public final class Base64 {
|
||||
return encode(src, off, len, Base64Dialect.STANDARD, bufferFactory);
|
||||
}
|
||||
|
||||
public static ChannelBuffer encode(ChannelBuffer src, int off, int len, Base64Dialect dialect, ChannelBufferFactory bufferFactory) {
|
||||
public static ChannelBuffer encode(
|
||||
ChannelBuffer src, int off, int len, Base64Dialect dialect, ChannelBufferFactory bufferFactory) {
|
||||
return encode(src, off, len, breakLines(dialect), dialect, bufferFactory);
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,8 @@ package org.jboss.netty.handler.codec.base64;
|
||||
* Enumeration of supported Base64 dialects.
|
||||
* <p>
|
||||
* The internal lookup tables in this class has been derived from
|
||||
* <a href="http://iharder.sourceforge.net/current/java/base64/">Robert Harder's Public Domain Base64 Encoder/Decoder</a>.
|
||||
* <a href="http://iharder.sourceforge.net/current/java/base64/">Robert Harder's Public Domain
|
||||
* Base64 Encoder/Decoder</a>.
|
||||
*/
|
||||
public enum Base64Dialect {
|
||||
/**
|
||||
|
@ -25,7 +25,8 @@ import org.jboss.netty.channel.DefaultChannelConfig;
|
||||
|
||||
/**
|
||||
* TODO Make EmbeddedChannel implement ChannelConfig and ChannelSink to reduce overhead.
|
||||
* TODO Do not extend AbstractChannel to reduce overhead and remove the internal-use-only constructor in AbstractChannel.
|
||||
* TODO Do not extend AbstractChannel to reduce overhead and remove the internal-use-only
|
||||
* constructor in AbstractChannel.
|
||||
*/
|
||||
class EmbeddedChannel extends AbstractChannel {
|
||||
|
||||
|
@ -34,7 +34,7 @@ import org.jboss.netty.util.CharsetUtil;
|
||||
* <pre>
|
||||
* String data = "foobar";
|
||||
*
|
||||
* {@link EncoderEmbedder}<{@link ChannelBuffer}> embedder = new {@link EncoderEmbedder}<{@link ChannelBuffer}>(
|
||||
* {@link EncoderEmbedder}<{@link ChannelBuffer}> embedder = new {@link EncoderEmbedder}<>(
|
||||
* new {@link Base64Encoder}(), new {@link StringEncoder}());
|
||||
*
|
||||
* embedder.offer(data);
|
||||
|
@ -51,8 +51,11 @@ public class FixedLengthFrameDecoder extends FrameDecoder {
|
||||
/**
|
||||
* Creates a new instance.
|
||||
*
|
||||
* @param frameLength the length of the frame
|
||||
* @param allocateFullBuffer <code>true</code> if the cumulative {@link ChannelBuffer} should use the {@link #frameLength} as its initial size
|
||||
* @param frameLength
|
||||
* the length of the frame
|
||||
* @param allocateFullBuffer
|
||||
* <code>true</code> if the cumulative {@link ChannelBuffer} should use the
|
||||
* {@link #frameLength} as its initial size
|
||||
*/
|
||||
public FixedLengthFrameDecoder(int frameLength, boolean allocateFullBuffer) {
|
||||
if (frameLength <= 0) {
|
||||
|
@ -214,7 +214,8 @@ public abstract class FrameDecoder extends SimpleChannelUpstreamHandler implemen
|
||||
callDecode(ctx, e.getChannel(), input, e.getRemoteAddress());
|
||||
} finally {
|
||||
if (input.readable()) {
|
||||
// seems like there is something readable left in the input buffer. So create the cumulation buffer and copy the input into it
|
||||
// seems like there is something readable left in the input buffer. So create
|
||||
// the cumulation buffer and copy the input into it
|
||||
(cumulation = newCumulationBuffer(ctx, input.readableBytes())).writeBytes(input);
|
||||
}
|
||||
}
|
||||
@ -350,7 +351,8 @@ public abstract class FrameDecoder extends SimpleChannelUpstreamHandler implemen
|
||||
}
|
||||
}
|
||||
|
||||
protected final void unfoldAndFireMessageReceived(ChannelHandlerContext context, SocketAddress remoteAddress, Object result) {
|
||||
protected final void unfoldAndFireMessageReceived(
|
||||
ChannelHandlerContext context, SocketAddress remoteAddress, Object result) {
|
||||
if (unfold) {
|
||||
if (result instanceof Object[]) {
|
||||
for (Object r: (Object[]) result) {
|
||||
@ -369,8 +371,8 @@ public abstract class FrameDecoder extends SimpleChannelUpstreamHandler implemen
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets called on {@link #channelDisconnected(ChannelHandlerContext, ChannelStateEvent)} and {@link #channelClosed(ChannelHandlerContext, ChannelStateEvent)}
|
||||
*
|
||||
* Gets called on {@link #channelDisconnected(ChannelHandlerContext, ChannelStateEvent)} and
|
||||
* {@link #channelClosed(ChannelHandlerContext, ChannelStateEvent)}
|
||||
*/
|
||||
protected void cleanup(ChannelHandlerContext ctx, ChannelStateEvent e)
|
||||
throws Exception {
|
||||
@ -420,7 +422,8 @@ public abstract class FrameDecoder extends SimpleChannelUpstreamHandler implemen
|
||||
*/
|
||||
public void replace(String handlerName, ChannelHandler handler) {
|
||||
if (ctx == null) {
|
||||
throw new IllegalStateException("Replace cann only be called once the FrameDecoder is added to the ChannelPipeline");
|
||||
throw new IllegalStateException(
|
||||
"Replace cann only be called once the FrameDecoder is added to the ChannelPipeline");
|
||||
}
|
||||
ChannelPipeline pipeline = ctx.getPipeline();
|
||||
pipeline.addAfter(ctx.getName(), handlerName, handler);
|
||||
|
@ -41,8 +41,8 @@ import java.util.regex.Pattern;
|
||||
*/
|
||||
public class CookieDecoder {
|
||||
|
||||
private static final Pattern PATTERN =
|
||||
Pattern.compile("(?:\\s|[;,])*\\$*([^;=]+)(?:=(?:[\"']((?:\\\\.|[^\"])*)[\"']|([^;,]*)))?(\\s*(?:[;,]+\\s*|$))");
|
||||
private static final Pattern PATTERN = Pattern.compile(
|
||||
"(?:\\s|[;,])*\\$*([^;=]+)(?:=(?:[\"']((?:\\\\.|[^\"])*)[\"']|([^;,]*)))?(\\s*(?:[;,]+\\s*|$))");
|
||||
|
||||
private static final String COMMA = ",";
|
||||
|
||||
|
@ -219,7 +219,8 @@ public class HttpClientCodec implements ChannelUpstreamHandler,
|
||||
if (failOnMissingResponse) {
|
||||
long missingResponses = requestResponseCounter.get();
|
||||
if (missingResponses > 0) {
|
||||
throw new PrematureChannelClosureException("Channel closed but still missing " + missingResponses + " response(s)");
|
||||
throw new PrematureChannelClosureException(
|
||||
"Channel closed but still missing " + missingResponses + " response(s)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -150,7 +150,8 @@ public abstract class HttpContentEncoder extends SimpleChannelHandler {
|
||||
// the last product on closure,
|
||||
if (lastProduct.readable()) {
|
||||
Channels.write(
|
||||
ctx, Channels.succeededFuture(e.getChannel()), new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
|
||||
ctx, Channels.succeededFuture(e.getChannel()),
|
||||
new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
|
||||
}
|
||||
|
||||
// Emit the last chunk.
|
||||
|
@ -167,7 +167,8 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, State state) throws Exception {
|
||||
protected Object decode(
|
||||
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, State state) throws Exception {
|
||||
switch (state) {
|
||||
case SKIP_CONTROL_CHARS: {
|
||||
try {
|
||||
@ -270,7 +271,7 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
||||
return readFixedLengthContent(buffer);
|
||||
}
|
||||
case READ_FIXED_LENGTH_CONTENT_AS_CHUNKS: {
|
||||
assert this.chunkSize <= Integer.MAX_VALUE;
|
||||
assert chunkSize <= Integer.MAX_VALUE;
|
||||
int chunkSize = (int) this.chunkSize;
|
||||
int readLimit = actualReadableBytes();
|
||||
int toRead = chunkSize;
|
||||
@ -323,7 +324,7 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
||||
return chunk;
|
||||
}
|
||||
case READ_CHUNKED_CONTENT_AS_CHUNKS: {
|
||||
assert this.chunkSize <= Integer.MAX_VALUE;
|
||||
assert chunkSize <= Integer.MAX_VALUE;
|
||||
int chunkSize = (int) this.chunkSize;
|
||||
int readLimit = actualReadableBytes();
|
||||
int toRead = chunkSize;
|
||||
|
@ -26,28 +26,32 @@ import java.util.Map;
|
||||
*/
|
||||
public class HttpMethod implements Comparable<HttpMethod> {
|
||||
/**
|
||||
* The OPTIONS method represents a request for information about the communication options available on the request/response
|
||||
* chain identified by the Request-URI. This method allows the client to determine the options and/or requirements
|
||||
* associated with a resource, or the capabilities of a server, without implying a resource action or initiating a
|
||||
* resource retrieval.
|
||||
* The OPTIONS method represents a request for information about the communication options
|
||||
* available on the request/response chain identified by the Request-URI. This method allows
|
||||
* the client to determine the options and/or requirements associated with a resource, or the
|
||||
* capabilities of a server, without implying a resource action or initiating a resource
|
||||
* retrieval.
|
||||
*/
|
||||
public static final HttpMethod OPTIONS = new HttpMethod("OPTIONS");
|
||||
|
||||
/**
|
||||
* The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI.
|
||||
* If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the entity
|
||||
* in the response and not the source text of the process, unless that text happens to be the output of the process.
|
||||
* The GET method means retrieve whatever information (in the form of an entity) is identified
|
||||
* by the Request-URI. If the Request-URI refers to a data-producing process, it is the
|
||||
* produced data which shall be returned as the entity in the response and not the source text
|
||||
* of the process, unless that text happens to be the output of the process.
|
||||
*/
|
||||
public static final HttpMethod GET = new HttpMethod("GET");
|
||||
|
||||
/**
|
||||
* The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response.
|
||||
* The HEAD method is identical to GET except that the server MUST NOT return a message-body in
|
||||
* the response.
|
||||
*/
|
||||
public static final HttpMethod HEAD = new HttpMethod("HEAD");
|
||||
|
||||
/**
|
||||
* The POST method is used to request that the origin server accept the entity enclosed in the request as a new
|
||||
* subordinate of the resource identified by the Request-URI in the Request-Line.
|
||||
* The POST method is used to request that the origin server accept the entity enclosed in the
|
||||
* request as a new subordinate of the resource identified by the Request-URI in the
|
||||
* Request-Line.
|
||||
*/
|
||||
public static final HttpMethod POST = new HttpMethod("POST");
|
||||
|
||||
@ -63,17 +67,20 @@ public class HttpMethod implements Comparable<HttpMethod> {
|
||||
public static final HttpMethod PATCH = new HttpMethod("PATCH");
|
||||
|
||||
/**
|
||||
* The DELETE method requests that the origin server delete the resource identified by the Request-URI.
|
||||
* The DELETE method requests that the origin server delete the resource identified by the
|
||||
* Request-URI.
|
||||
*/
|
||||
public static final HttpMethod DELETE = new HttpMethod("DELETE");
|
||||
|
||||
/**
|
||||
* The TRACE method is used to invoke a remote, application-layer loop- back of the request message.
|
||||
* The TRACE method is used to invoke a remote, application-layer loop- back of the request
|
||||
* message.
|
||||
*/
|
||||
public static final HttpMethod TRACE = new HttpMethod("TRACE");
|
||||
|
||||
/**
|
||||
* This specification reserves the method name CONNECT for use with a proxy that can dynamically switch to being a tunnel
|
||||
* This specification reserves the method name CONNECT for use with a proxy that can
|
||||
* dynamically switch to being a tunnel
|
||||
*/
|
||||
public static final HttpMethod CONNECT = new HttpMethod("CONNECT");
|
||||
|
||||
|
@ -102,7 +102,9 @@ public class HttpResponseDecoder extends HttpMessageDecoder {
|
||||
|
||||
@Override
|
||||
protected HttpMessage createMessage(String[] initialLine) {
|
||||
return new DefaultHttpResponse(HttpVersion.valueOf(initialLine[0]), new HttpResponseStatus(Integer.valueOf(initialLine[1]), initialLine[2]));
|
||||
return new DefaultHttpResponse(
|
||||
HttpVersion.valueOf(initialLine[0]),
|
||||
new HttpResponseStatus(Integer.valueOf(initialLine[1]), initialLine[2]));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -56,7 +56,8 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 203 Non-Authoritative Information (since HTTP/1.1)
|
||||
*/
|
||||
public static final HttpResponseStatus NON_AUTHORITATIVE_INFORMATION = new HttpResponseStatus(203, "Non-Authoritative Information");
|
||||
public static final HttpResponseStatus NON_AUTHORITATIVE_INFORMATION =
|
||||
new HttpResponseStatus(203, "Non-Authoritative Information");
|
||||
|
||||
/**
|
||||
* 204 No Content
|
||||
@ -151,7 +152,8 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 407 Proxy Authentication Required
|
||||
*/
|
||||
public static final HttpResponseStatus PROXY_AUTHENTICATION_REQUIRED = new HttpResponseStatus(407, "Proxy Authentication Required");
|
||||
public static final HttpResponseStatus PROXY_AUTHENTICATION_REQUIRED =
|
||||
new HttpResponseStatus(407, "Proxy Authentication Required");
|
||||
|
||||
/**
|
||||
* 408 Request Timeout
|
||||
@ -181,7 +183,8 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 413 Request Entity Too Large
|
||||
*/
|
||||
public static final HttpResponseStatus REQUEST_ENTITY_TOO_LARGE = new HttpResponseStatus(413, "Request Entity Too Large");
|
||||
public static final HttpResponseStatus REQUEST_ENTITY_TOO_LARGE =
|
||||
new HttpResponseStatus(413, "Request Entity Too Large");
|
||||
|
||||
/**
|
||||
* 414 Request-URI Too Long
|
||||
@ -191,12 +194,14 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 415 Unsupported Media Type
|
||||
*/
|
||||
public static final HttpResponseStatus UNSUPPORTED_MEDIA_TYPE = new HttpResponseStatus(415, "Unsupported Media Type");
|
||||
public static final HttpResponseStatus UNSUPPORTED_MEDIA_TYPE =
|
||||
new HttpResponseStatus(415, "Unsupported Media Type");
|
||||
|
||||
/**
|
||||
* 416 Requested Range Not Satisfiable
|
||||
*/
|
||||
public static final HttpResponseStatus REQUESTED_RANGE_NOT_SATISFIABLE = new HttpResponseStatus(416, "Requested Range Not Satisfiable");
|
||||
public static final HttpResponseStatus REQUESTED_RANGE_NOT_SATISFIABLE =
|
||||
new HttpResponseStatus(416, "Requested Range Not Satisfiable");
|
||||
|
||||
/**
|
||||
* 417 Expectation Failed
|
||||
@ -231,7 +236,8 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 500 Internal Server Error
|
||||
*/
|
||||
public static final HttpResponseStatus INTERNAL_SERVER_ERROR = new HttpResponseStatus(500, "Internal Server Error");
|
||||
public static final HttpResponseStatus INTERNAL_SERVER_ERROR =
|
||||
new HttpResponseStatus(500, "Internal Server Error");
|
||||
|
||||
/**
|
||||
* 501 Not Implemented
|
||||
@ -256,12 +262,14 @@ public class HttpResponseStatus implements Comparable<HttpResponseStatus> {
|
||||
/**
|
||||
* 505 HTTP Version Not Supported
|
||||
*/
|
||||
public static final HttpResponseStatus HTTP_VERSION_NOT_SUPPORTED = new HttpResponseStatus(505, "HTTP Version Not Supported");
|
||||
public static final HttpResponseStatus HTTP_VERSION_NOT_SUPPORTED =
|
||||
new HttpResponseStatus(505, "HTTP Version Not Supported");
|
||||
|
||||
/**
|
||||
* 506 Variant Also Negotiates (RFC2295)
|
||||
*/
|
||||
public static final HttpResponseStatus VARIANT_ALSO_NEGOTIATES = new HttpResponseStatus(506, "Variant Also Negotiates");
|
||||
public static final HttpResponseStatus VARIANT_ALSO_NEGOTIATES =
|
||||
new HttpResponseStatus(506, "Variant Also Negotiates");
|
||||
|
||||
/**
|
||||
* 507 Insufficient Storage (WebDAV, RFC4918)
|
||||
|
@ -47,10 +47,10 @@ import org.jboss.netty.util.CharsetUtil;
|
||||
*
|
||||
* <h3>HashDOS vulnerability fix</h3>
|
||||
*
|
||||
* As a workaround to the <a href="http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf">HashDOS</a>
|
||||
* vulnerability, the decoder limits the maximum number of decoded key-value
|
||||
* parameter pairs, up to {@literal 1024} by default, and you can configure it
|
||||
* when you construct the decoder by passing an additional integer parameter.
|
||||
* As a workaround to the <a href="http://goo.gl/I4Nky">HashDOS</a> vulnerability, the decoder
|
||||
* limits the maximum number of decoded key-value parameter pairs, up to {@literal 1024} by
|
||||
* default, and you can configure it when you construct the decoder by passing an additional
|
||||
* integer parameter.
|
||||
*
|
||||
* @see QueryStringEncoder
|
||||
*
|
||||
|
@ -461,7 +461,8 @@ public class HttpPostRequestDecoder {
|
||||
} else if (read == '&') { // special empty FIELD
|
||||
currentStatus = MultiPartStatus.DISPOSITION;
|
||||
ampersandpos = currentpos - 1;
|
||||
String key = decodeAttribute(undecodedChunk.toString(firstpos, ampersandpos - firstpos, charset), charset);
|
||||
String key = decodeAttribute(
|
||||
undecodedChunk.toString(firstpos, ampersandpos - firstpos, charset), charset);
|
||||
currentAttribute = factory.createAttribute(request, key);
|
||||
currentAttribute.setValue(""); // empty
|
||||
addHttpData(currentAttribute);
|
||||
@ -587,7 +588,8 @@ public class HttpPostRequestDecoder {
|
||||
} else if (read == '&') { // special empty FIELD
|
||||
currentStatus = MultiPartStatus.DISPOSITION;
|
||||
ampersandpos = currentpos - 1;
|
||||
String key = decodeAttribute(undecodedChunk.toString(firstpos, ampersandpos - firstpos, charset), charset);
|
||||
String key = decodeAttribute(
|
||||
undecodedChunk.toString(firstpos, ampersandpos - firstpos, charset), charset);
|
||||
currentAttribute = factory.createAttribute(request, key);
|
||||
currentAttribute.setValue(""); // empty
|
||||
addHttpData(currentAttribute);
|
||||
|
@ -20,8 +20,8 @@ import org.jboss.netty.buffer.ChannelBuffers;
|
||||
import org.jboss.netty.util.CharsetUtil;
|
||||
|
||||
/**
|
||||
* Web Socket continuation frame containing continuation text or binary data. This is used for fragmented messages where
|
||||
* the contents of a messages is contained more than 1 frame.
|
||||
* Web Socket continuation frame containing continuation text or binary data. This is used for
|
||||
* fragmented messages where the contents of a messages is contained more than 1 frame.
|
||||
*/
|
||||
public class ContinuationWebSocketFrame extends WebSocketFrame {
|
||||
|
||||
@ -35,7 +35,8 @@ public class ContinuationWebSocketFrame extends WebSocketFrame {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new continuation frame with the specified binary data. The final fragment flag is set to true.
|
||||
* Creates a new continuation frame with the specified binary data. The final fragment flag is
|
||||
* set to true.
|
||||
*
|
||||
* @param binaryData
|
||||
* the content of the frame.
|
||||
@ -72,7 +73,8 @@ public class ContinuationWebSocketFrame extends WebSocketFrame {
|
||||
* @param aggregatedText
|
||||
* Aggregated text set by decoder on the final continuation frame of a fragmented text message
|
||||
*/
|
||||
public ContinuationWebSocketFrame(boolean finalFragment, int rsv, ChannelBuffer binaryData, String aggregatedText) {
|
||||
public ContinuationWebSocketFrame(
|
||||
boolean finalFragment, int rsv, ChannelBuffer binaryData, String aggregatedText) {
|
||||
setFinalFragment(finalFragment);
|
||||
setRsv(rsv);
|
||||
setBinaryData(binaryData);
|
||||
|
@ -18,19 +18,20 @@
|
||||
*
|
||||
* Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
||||
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
* The above copyright notice and this permission notice shall be included in all copies or
|
||||
* substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||||
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package org.jboss.netty.handler.codec.http.websocketx;
|
||||
|
||||
|
@ -18,19 +18,20 @@
|
||||
*
|
||||
* Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
|
||||
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
||||
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
||||
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
* The above copyright notice and this permission notice shall be included in all copies or
|
||||
* substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|
||||
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package org.jboss.netty.handler.codec.http.websocketx;
|
||||
|
||||
@ -41,20 +42,23 @@ final class UTF8Output {
|
||||
private static final int UTF8_ACCEPT = 0;
|
||||
private static final int UTF8_REJECT = 12;
|
||||
|
||||
private static final byte[] TYPES = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 11,
|
||||
6, 6, 6, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };
|
||||
private static final byte[] TYPES = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8,
|
||||
8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 11, 6, 6, 6, 5, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8 };
|
||||
|
||||
private static final byte[] STATES = { 0, 12, 24, 36, 60, 96, 84, 12, 12, 12, 48, 72, 12, 12, 12, 12, 12, 12, 12,
|
||||
12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 0, 12, 0, 12, 12, 12, 24, 12, 12, 12, 12, 12, 24, 12, 24,
|
||||
12, 12, 12, 12, 12, 12, 12, 12, 12, 24, 12, 12, 12, 12, 12, 24, 12, 12, 12, 12, 12, 12, 12, 24, 12, 12, 12,
|
||||
12, 12, 12, 12, 12, 12, 36, 12, 36, 12, 12, 12, 36, 12, 12, 12, 12, 12, 36, 12, 36, 12, 12, 12, 36, 12, 12,
|
||||
12, 12, 12, 12, 12, 12, 12, 12 };
|
||||
private static final byte[] STATES = { 0, 12, 24, 36, 60, 96, 84, 12, 12, 12, 48, 72, 12, 12,
|
||||
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 0, 12, 12, 12, 12, 12, 0, 12, 0, 12, 12,
|
||||
12, 24, 12, 12, 12, 12, 12, 24, 12, 24, 12, 12, 12, 12, 12, 12, 12, 12, 12, 24, 12, 12,
|
||||
12, 12, 12, 24, 12, 12, 12, 12, 12, 12, 12, 24, 12, 12, 12, 12, 12, 12, 12, 12, 12, 36,
|
||||
12, 36, 12, 12, 12, 36, 12, 12, 12, 12, 12, 36, 12, 36, 12, 12, 12, 36, 12, 12, 12, 12,
|
||||
12, 12, 12, 12, 12, 12 };
|
||||
|
||||
private int state = UTF8_ACCEPT;
|
||||
private int codep;
|
||||
|
@ -27,8 +27,8 @@ public class WebSocketClientHandshakerFactory {
|
||||
* Instances a new handshaker
|
||||
*
|
||||
* @param webSocketURL
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath". Subsequent web socket frames will be
|
||||
* sent to this URL.
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath".
|
||||
* Subsequent web socket frames will be sent to this URL.
|
||||
* @param version
|
||||
* Version of web socket specification to use to connect to the server
|
||||
* @param subprotocol
|
||||
@ -48,8 +48,8 @@ public class WebSocketClientHandshakerFactory {
|
||||
* Instances a new handshaker
|
||||
*
|
||||
* @param webSocketURL
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath". Subsequent web socket frames will be
|
||||
* sent to this URL.
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath".
|
||||
* Subsequent web socket frames will be sent to this URL.
|
||||
* @param version
|
||||
* Version of web socket specification to use to connect to the server
|
||||
* @param subprotocol
|
||||
@ -59,20 +59,24 @@ public class WebSocketClientHandshakerFactory {
|
||||
* @param customHeaders
|
||||
* Custom HTTP headers to send during the handshake
|
||||
* @param maxFramePayloadLength
|
||||
* Maximum allowable frame payload length. Setting this value to your application's requirement may
|
||||
* reduce denial of service attacks using long data frames.
|
||||
* @throws WebSocketHandshakeException
|
||||
* Maximum allowable frame payload length. Setting this value to your application's
|
||||
* requirement may reduce denial of service attacks using long data frames.
|
||||
*/
|
||||
public WebSocketClientHandshaker newHandshaker(URI webSocketURL, WebSocketVersion version, String subprotocol,
|
||||
boolean allowExtensions, Map<String, String> customHeaders, long maxFramePayloadLength) throws WebSocketHandshakeException {
|
||||
public WebSocketClientHandshaker newHandshaker(
|
||||
URI webSocketURL, WebSocketVersion version, String subprotocol,
|
||||
boolean allowExtensions, Map<String, String> customHeaders, long maxFramePayloadLength)
|
||||
throws WebSocketHandshakeException {
|
||||
if (version == WebSocketVersion.V13) {
|
||||
return new WebSocketClientHandshaker13(webSocketURL, version, subprotocol, allowExtensions, customHeaders, maxFramePayloadLength);
|
||||
return new WebSocketClientHandshaker13(
|
||||
webSocketURL, version, subprotocol, allowExtensions, customHeaders, maxFramePayloadLength);
|
||||
}
|
||||
if (version == WebSocketVersion.V08) {
|
||||
return new WebSocketClientHandshaker08(webSocketURL, version, subprotocol, allowExtensions, customHeaders, maxFramePayloadLength);
|
||||
return new WebSocketClientHandshaker08(
|
||||
webSocketURL, version, subprotocol, allowExtensions, customHeaders, maxFramePayloadLength);
|
||||
}
|
||||
if (version == WebSocketVersion.V00) {
|
||||
return new WebSocketClientHandshaker00(webSocketURL, version, subprotocol, customHeaders, maxFramePayloadLength);
|
||||
return new WebSocketClientHandshaker00(
|
||||
webSocketURL, version, subprotocol, customHeaders, maxFramePayloadLength);
|
||||
}
|
||||
|
||||
throw new WebSocketHandshakeException("Protocol version " + version.toString() + " not supported.");
|
||||
|
@ -67,8 +67,8 @@ public class WebSocketServerHandshaker00 extends WebSocketServerHandshaker {
|
||||
* Constructor specifying the destination web socket location
|
||||
*
|
||||
* @param webSocketURL
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath". Subsequent web socket frames will be
|
||||
* sent to this URL.
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath".
|
||||
* Subsequent web socket frames will be sent to this URL.
|
||||
* @param subprotocols
|
||||
* CSV of supported protocols
|
||||
* @param maxFramePayloadLength
|
||||
|
@ -52,15 +52,15 @@ public class WebSocketServerHandshakerFactory {
|
||||
* Constructor
|
||||
*
|
||||
* @param webSocketURL
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath". Subsequent web socket frames will be
|
||||
* sent to this URL.
|
||||
* URL for web socket communications. e.g "ws://myhost.com/mypath".
|
||||
* Subsequent web socket frames will be sent to this URL.
|
||||
* @param subprotocols
|
||||
* CSV of supported protocols. Null if sub protocols not supported.
|
||||
* @param allowExtensions
|
||||
* Allow extensions to be used in the reserved bits of the web socket frame
|
||||
* @param maxFramePayloadLength
|
||||
* Maximum allowable frame payload length. Setting this value to your application's requirement may
|
||||
* reduce denial of service attacks using long data frames.
|
||||
* Maximum allowable frame payload length. Setting this value to your application's
|
||||
* requirement may reduce denial of service attacks using long data frames.
|
||||
*/
|
||||
public WebSocketServerHandshakerFactory(String webSocketURL, String subprotocols, boolean allowExtensions,
|
||||
long maxFramePayloadLength) {
|
||||
@ -73,8 +73,8 @@ public class WebSocketServerHandshakerFactory {
|
||||
/**
|
||||
* Instances a new handshaker
|
||||
*
|
||||
* @return A new WebSocketServerHandshaker for the requested web socket version. Null if web socket version is not
|
||||
* supported.
|
||||
* @return A new WebSocketServerHandshaker for the requested web socket version. Null if web
|
||||
* socket version is not supported.
|
||||
*/
|
||||
public WebSocketServerHandshaker newHandshaker(HttpRequest req) {
|
||||
|
||||
@ -82,16 +82,19 @@ public class WebSocketServerHandshakerFactory {
|
||||
if (version != null) {
|
||||
if (version.equals(WebSocketVersion.V13.toHttpHeaderValue())) {
|
||||
// Version 13 of the wire protocol - RFC 6455 (version 17 of the draft hybi specification).
|
||||
return new WebSocketServerHandshaker13(webSocketURL, subprotocols, allowExtensions, maxFramePayloadLength);
|
||||
return new WebSocketServerHandshaker13(
|
||||
webSocketURL, subprotocols, allowExtensions, maxFramePayloadLength);
|
||||
} else if (version.equals(WebSocketVersion.V08.toHttpHeaderValue())) {
|
||||
// Version 8 of the wire protocol - version 10 of the draft hybi specification.
|
||||
return new WebSocketServerHandshaker08(webSocketURL, subprotocols, allowExtensions, maxFramePayloadLength);
|
||||
return new WebSocketServerHandshaker08(
|
||||
webSocketURL, subprotocols, allowExtensions, maxFramePayloadLength);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
// Assume version 00 where version header was not specified
|
||||
return new WebSocketServerHandshaker00(webSocketURL, subprotocols, maxFramePayloadLength);
|
||||
return new WebSocketServerHandshaker00(
|
||||
webSocketURL, subprotocols, maxFramePayloadLength);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,9 +21,10 @@
|
||||
* This package supports different web socket specification versions (hence the X suffix).
|
||||
* The specification current supported are:
|
||||
* <ul>
|
||||
* <li><a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00">draft-ietf-hybi-thewebsocketprotocol-00</a></li>
|
||||
* <li><a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10">draft-ietf-hybi-thewebsocketprotocol-10</a></li>
|
||||
* <li><a href="http://tools.ietf.org/html/rfc6455 ">RFC 6455</a> (originally <a href="http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17">draft-ietf-hybi-thewebsocketprotocol-17</a>)</li>
|
||||
* <li><a href="http://goo.gl/wFiu3">draft-ietf-hybi-thewebsocketprotocol-00</a></li>
|
||||
* <li><a href="http://goo.gl/h27VE">draft-ietf-hybi-thewebsocketprotocol-10</a></li>
|
||||
* <li><a href="http://tools.ietf.org/html/rfc6455 ">RFC 6455</a> (originally
|
||||
* <a href="http://goo.gl/zVBkL">draft-ietf-hybi-thewebsocketprotocol-17</a>)</li>
|
||||
* </ul>
|
||||
* </p>
|
||||
* <p>
|
||||
|
@ -42,12 +42,15 @@ public class CompatibleMarshallingDecoder extends ReplayingDecoder<VoidEnum> {
|
||||
/**
|
||||
* Create a new instance of {@link CompatibleMarshallingDecoder}.
|
||||
*
|
||||
* @param provider the {@link UnmarshallerProvider} which is used to obtain the {@link Unmarshaller} for the {@link Channel}
|
||||
* @param maxObjectSize the maximal size (in bytes) of the {@link Object} to unmarshal. Once the size is exceeded
|
||||
* the {@link Channel} will get closed. Use a a maxObjectSize of {@link Integer#MAX_VALUE} to disable this.
|
||||
* You should only do this if you are sure that the received Objects will never be big and the
|
||||
* sending side are trusted, as this opens the possibility for a DOS-Attack due an {@link OutOfMemoryError}.
|
||||
*
|
||||
* @param provider
|
||||
* the {@link UnmarshallerProvider} which is used to obtain the {@link Unmarshaller}
|
||||
* for the {@link Channel}
|
||||
* @param maxObjectSize
|
||||
* the maximal size (in bytes) of the {@link Object} to unmarshal. Once the size is
|
||||
* exceeded the {@link Channel} will get closed. Use a a maxObjectSize of
|
||||
* {@link Integer#MAX_VALUE} to disable this. You should only do this if you are sure
|
||||
* that the received Objects will never be big and the sending side are trusted, as
|
||||
* this opens the possibility for a DOS-Attack due an {@link OutOfMemoryError}.
|
||||
*/
|
||||
public CompatibleMarshallingDecoder(UnmarshallerProvider provider, int maxObjectSize) {
|
||||
this.provider = provider;
|
||||
@ -55,7 +58,8 @@ public class CompatibleMarshallingDecoder extends ReplayingDecoder<VoidEnum> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, VoidEnum state) throws Exception {
|
||||
protected Object decode(
|
||||
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, VoidEnum state) throws Exception {
|
||||
Unmarshaller unmarshaller = provider.getUnmarshaller(ctx);
|
||||
ByteInput input = new ChannelBufferByteInput(buffer);
|
||||
if (maxObjectSize != Integer.MAX_VALUE) {
|
||||
|
@ -50,7 +50,8 @@ public class CompatibleMarshallingEncoder extends OneToOneEncoder {
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
|
||||
Marshaller marshaller = provider.getMarshaller(ctx);
|
||||
ChannelBufferByteOutput output = new ChannelBufferByteOutput(ctx.getChannel().getConfig().getBufferFactory(), 256);
|
||||
ChannelBufferByteOutput output =
|
||||
new ChannelBufferByteOutput(ctx.getChannel().getConfig().getBufferFactory(), 256);
|
||||
marshaller.start(output);
|
||||
marshaller.writeObject(msg);
|
||||
marshaller.finish();
|
||||
@ -58,5 +59,4 @@ public class CompatibleMarshallingEncoder extends OneToOneEncoder {
|
||||
|
||||
return output.getBuffer();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -27,7 +27,8 @@ import org.jboss.netty.handler.codec.frame.TooLongFrameException;
|
||||
/**
|
||||
* Decoder which MUST be used with {@link MarshallingEncoder}.
|
||||
*
|
||||
* A {@link LengthFieldBasedFrameDecoder} which use an {@link Unmarshaller} to read the Object out of the {@link ChannelBuffer}.
|
||||
* A {@link LengthFieldBasedFrameDecoder} which use an {@link Unmarshaller} to read the Object out
|
||||
* of the {@link ChannelBuffer}.
|
||||
*
|
||||
*/
|
||||
public class MarshallingDecoder extends LengthFieldBasedFrameDecoder {
|
||||
@ -77,8 +78,8 @@ public class MarshallingDecoder extends LengthFieldBasedFrameDecoder {
|
||||
unmarshaller.finish();
|
||||
return obj;
|
||||
} finally {
|
||||
// Call close in a finally block as the ReplayingDecoder will throw an Error if not enough bytes are
|
||||
// readable. This helps to be sure that we do not leak resource
|
||||
// Call close in a finally block as the ReplayingDecoder will throw an Error if not
|
||||
// enough bytes are readable. This helps to be sure that we do not leak resource
|
||||
unmarshaller.close();
|
||||
}
|
||||
}
|
||||
|
@ -75,7 +75,8 @@ public class MarshallingEncoder extends OneToOneEncoder {
|
||||
@Override
|
||||
protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
|
||||
Marshaller marshaller = provider.getMarshaller(ctx);
|
||||
ChannelBufferByteOutput output = new ChannelBufferByteOutput(ctx.getChannel().getConfig().getBufferFactory(), estimatedLength);
|
||||
ChannelBufferByteOutput output = new ChannelBufferByteOutput(
|
||||
ctx.getChannel().getConfig().getBufferFactory(), estimatedLength);
|
||||
output.getBuffer().writeBytes(LENGTH_PLACEHOLDER);
|
||||
marshaller.start(output);
|
||||
marshaller.writeObject(msg);
|
||||
|
@ -389,8 +389,9 @@ public abstract class ReplayingDecoder<T extends Enum<T>>
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls {@link #decode(ChannelHandlerContext, Channel, ChannelBuffer, Enum)}. This method should be never used by {@link ReplayingDecoder} itself.
|
||||
* But to be safe we should handle it anyway
|
||||
* Calls {@link #decode(ChannelHandlerContext, Channel, ChannelBuffer, Enum)}. This method
|
||||
* should be never used by {@link ReplayingDecoder} itself. But to be safe we should handle it
|
||||
* anyway
|
||||
*/
|
||||
@Override
|
||||
protected final Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
|
||||
@ -520,7 +521,9 @@ public abstract class ReplayingDecoder<T extends Enum<T>>
|
||||
}
|
||||
}
|
||||
|
||||
private void callDecode(ChannelHandlerContext context, Channel channel, ChannelBuffer input, ChannelBuffer replayableInput, SocketAddress remoteAddress) throws Exception {
|
||||
private void callDecode(
|
||||
ChannelHandlerContext context, Channel channel,
|
||||
ChannelBuffer input, ChannelBuffer replayableInput, SocketAddress remoteAddress) throws Exception {
|
||||
while (input.readable()) {
|
||||
int oldReaderIndex = checkpoint = input.readerIndex();
|
||||
Object result = null;
|
||||
|
@ -27,10 +27,11 @@ import org.jboss.netty.handler.codec.http.HttpMethod;
|
||||
public final class RtspMethods {
|
||||
|
||||
/**
|
||||
* The OPTIONS method represents a request for information about the communication options available on the request/response
|
||||
* chain identified by the Request-URI. This method allows the client to determine the options and/or requirements
|
||||
* associated with a resource, or the capabilities of a server, without implying a resource action or initiating a
|
||||
* resource retrieval.
|
||||
* The OPTIONS method represents a request for information about the communication options
|
||||
* available on the request/response chain identified by the Request-URI. This method allows
|
||||
* the client to determine the options and/or requirements associated with a resource, or the
|
||||
* capabilities of a server, without implying a resource action or initiating a resource
|
||||
* retrieval.
|
||||
*/
|
||||
public static final HttpMethod OPTIONS = HttpMethod.OPTIONS;
|
||||
|
||||
|
@ -107,7 +107,8 @@ public final class RtspResponseStatuses {
|
||||
/**
|
||||
* 407 Proxy Authentication Required
|
||||
*/
|
||||
public static final HttpResponseStatus PROXY_AUTHENTICATION_REQUIRED = HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED;
|
||||
public static final HttpResponseStatus PROXY_AUTHENTICATION_REQUIRED =
|
||||
HttpResponseStatus.PROXY_AUTHENTICATION_REQUIRED;
|
||||
|
||||
/**
|
||||
* 408 Request Timeout
|
||||
|
@ -38,7 +38,9 @@ public final class ClassResolvers {
|
||||
* @return new instance of class resolver
|
||||
*/
|
||||
public static ClassResolver weakCachingResolver(ClassLoader classLoader) {
|
||||
return new CachingClassResolver(new ClassLoaderClassResolver(defaultClassLoader(classLoader)), new WeakReferenceMap<String, Class<?>>(new HashMap<String, Reference<Class<?>>>()));
|
||||
return new CachingClassResolver(
|
||||
new ClassLoaderClassResolver(defaultClassLoader(classLoader)),
|
||||
new WeakReferenceMap<String, Class<?>>(new HashMap<String, Reference<Class<?>>>()));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -49,7 +51,9 @@ public final class ClassResolvers {
|
||||
* @return new instance of class resolver
|
||||
*/
|
||||
public static ClassResolver softCachingResolver(ClassLoader classLoader) {
|
||||
return new CachingClassResolver(new ClassLoaderClassResolver(defaultClassLoader(classLoader)), new SoftReferenceMap<String, Class<?>>(new HashMap<String, Reference<Class<?>>>()));
|
||||
return new CachingClassResolver(
|
||||
new ClassLoaderClassResolver(defaultClassLoader(classLoader)),
|
||||
new SoftReferenceMap<String, Class<?>>(new HashMap<String, Reference<Class<?>>>()));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -60,7 +64,9 @@ public final class ClassResolvers {
|
||||
* @return new instance of class resolver
|
||||
*/
|
||||
public static ClassResolver weakCachingConcurrentResolver(ClassLoader classLoader) {
|
||||
return new CachingClassResolver(new ClassLoaderClassResolver(defaultClassLoader(classLoader)), new WeakReferenceMap<String, Class<?>>(new ConcurrentHashMap<String, Reference<Class<?>>>()));
|
||||
return new CachingClassResolver(
|
||||
new ClassLoaderClassResolver(defaultClassLoader(classLoader)),
|
||||
new WeakReferenceMap<String, Class<?>>(new ConcurrentHashMap<String, Reference<Class<?>>>()));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -71,7 +77,9 @@ public final class ClassResolvers {
|
||||
* @return new instance of class resolver
|
||||
*/
|
||||
public static ClassResolver softCachingConcurrentResolver(ClassLoader classLoader) {
|
||||
return new CachingClassResolver(new ClassLoaderClassResolver(defaultClassLoader(classLoader)), new SoftReferenceMap<String, Class<?>>(new ConcurrentHashMap<String, Reference<Class<?>>>()));
|
||||
return new CachingClassResolver(
|
||||
new ClassLoaderClassResolver(defaultClassLoader(classLoader)),
|
||||
new SoftReferenceMap<String, Class<?>>(new ConcurrentHashMap<String, Reference<Class<?>>>()));
|
||||
}
|
||||
|
||||
static ClassLoader defaultClassLoader(ClassLoader classLoader) {
|
||||
|
@ -74,7 +74,8 @@ public class CompatibleObjectDecoder extends ReplayingDecoder<CompatibleObjectDe
|
||||
|
||||
@Override
|
||||
protected Object decode(
|
||||
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, CompatibleObjectDecoderState state) throws Exception {
|
||||
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer,
|
||||
CompatibleObjectDecoderState state) throws Exception {
|
||||
bin.switchStream(new ChannelBufferInputStream(buffer));
|
||||
switch (state) {
|
||||
case READ_HEADER:
|
||||
|
@ -97,7 +97,8 @@ public class ObjectDecoder extends LengthFieldBasedFrameDecoder {
|
||||
|
||||
|
||||
/**
|
||||
* Create a new decoder with the specified maximum object size and the {@link ClassLoader} wrapped in {@link ClassResolvers#weakCachingResolver(ClassLoader)}
|
||||
* Create a new decoder with the specified maximum object size and the {@link ClassLoader}
|
||||
* wrapped in {@link ClassResolvers#weakCachingResolver(ClassLoader)}.
|
||||
*
|
||||
* @param maxObjectSize the maximum byte length of the serialized object.
|
||||
* if the length of the received object is greater
|
||||
|
@ -280,7 +280,8 @@ public class SpdyHttpEncoder implements ChannelDownstreamHandler {
|
||||
httpMessage.removeHeader("Proxy-Connection");
|
||||
httpMessage.removeHeader(HttpHeaders.Names.TRANSFER_ENCODING);
|
||||
|
||||
SpdySynStreamFrame spdySynStreamFrame = new DefaultSpdySynStreamFrame(streamID, associatedToStreamID, priority);
|
||||
SpdySynStreamFrame spdySynStreamFrame =
|
||||
new DefaultSpdySynStreamFrame(streamID, associatedToStreamID, priority);
|
||||
|
||||
// Unfold the first line of the message into name/value pairs
|
||||
if (httpMessage instanceof HttpRequest) {
|
||||
|
@ -479,7 +479,8 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
|
||||
e.getFuture().addListener(new ChannelFutureListener() {
|
||||
public void operationComplete(ChannelFuture future) throws Exception {
|
||||
if (!future.isSuccess()) {
|
||||
issueStreamError(context, remoteAddress, streamID, SpdyStreamStatus.INTERNAL_ERROR);
|
||||
issueStreamError(
|
||||
context, remoteAddress, streamID, SpdyStreamStatus.INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -504,7 +505,8 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
|
||||
e.getFuture().addListener(new ChannelFutureListener() {
|
||||
public void operationComplete(ChannelFuture future) throws Exception {
|
||||
if (!future.isSuccess()) {
|
||||
issueStreamError(context, remoteAddress, streamID, SpdyStreamStatus.INTERNAL_ERROR);
|
||||
issueStreamError(
|
||||
context, remoteAddress, streamID, SpdyStreamStatus.INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -737,7 +739,8 @@ public class SpdySessionHandler extends SimpleChannelUpstreamHandler
|
||||
return false;
|
||||
}
|
||||
spdySession.acceptStream(
|
||||
streamID, priority, remoteSideClosed, localSideClosed, initialSendWindowSize, initialReceiveWindowSize);
|
||||
streamID, priority, remoteSideClosed, localSideClosed,
|
||||
initialSendWindowSize, initialReceiveWindowSize);
|
||||
if (isRemoteInitiatedID(streamID)) {
|
||||
lastGoodStreamID = streamID;
|
||||
}
|
||||
|
@ -32,10 +32,12 @@ public class ChainedExecutor implements Executor, ExternalResourceReleasable {
|
||||
private final ChannelEventRunnableFilter filter;
|
||||
|
||||
/**
|
||||
* Create a new {@link ChainedExecutor} which will used the given {@link ChannelEventRunnableFilter} to see if the {@link #cur} {@link Executor} should get used.
|
||||
* Otherwise it will pass the work to the {@link #next} {@link Executor}
|
||||
* Create a new {@link ChainedExecutor} which will used the given
|
||||
* {@link ChannelEventRunnableFilter} to see if the {@link #cur} {@link Executor} should get
|
||||
* used. Otherwise it will pass the work to the {@link #next} {@link Executor}
|
||||
*
|
||||
* @param filter the {@link ChannelEventRunnableFilter} which will be used to check if the {@link ChannelEventRunnable} should be passed to the cur or next {@link Executor}
|
||||
* @param filter the {@link ChannelEventRunnableFilter} which will be used to check if the
|
||||
* {@link ChannelEventRunnable} should be passed to the cur or next {@link Executor}
|
||||
* @param cur the {@link Executor} to use if the {@link ChannelEventRunnableFilter} match
|
||||
* @param next the {@link Executor} to use if the {@link ChannelEventRunnableFilter} does not match
|
||||
*/
|
||||
@ -56,8 +58,9 @@ public class ChainedExecutor implements Executor, ExternalResourceReleasable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the passed {@link ChannelEventRunnable} with the current {@link Executor} if the {@link ChannelEventRunnableFilter} match.
|
||||
* Otherwise pass it to the next {@link Executor} in the chain.
|
||||
* Execute the passed {@link ChannelEventRunnable} with the current {@link Executor} if the
|
||||
* {@link ChannelEventRunnableFilter} match. Otherwise pass it to the next {@link Executor} in
|
||||
* the chain.
|
||||
*/
|
||||
public void execute(Runnable command) {
|
||||
assert command instanceof ChannelEventRunnable;
|
||||
|
@ -182,7 +182,9 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
|
||||
int corePoolSize, long maxChannelMemorySize, long maxTotalMemorySize,
|
||||
long keepAliveTime, TimeUnit unit) {
|
||||
|
||||
this(corePoolSize, maxChannelMemorySize, maxTotalMemorySize, keepAliveTime, unit, Executors.defaultThreadFactory());
|
||||
this(
|
||||
corePoolSize, maxChannelMemorySize, maxTotalMemorySize, keepAliveTime, unit,
|
||||
Executors.defaultThreadFactory());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -201,7 +203,9 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
|
||||
int corePoolSize, long maxChannelMemorySize, long maxTotalMemorySize,
|
||||
long keepAliveTime, TimeUnit unit, ThreadFactory threadFactory) {
|
||||
|
||||
this(corePoolSize, maxChannelMemorySize, maxTotalMemorySize, keepAliveTime, unit, new DefaultObjectSizeEstimator(), threadFactory);
|
||||
this(
|
||||
corePoolSize, maxChannelMemorySize, maxTotalMemorySize, keepAliveTime, unit,
|
||||
new DefaultObjectSizeEstimator(), threadFactory);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -277,11 +281,13 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
|
||||
}
|
||||
|
||||
/**
|
||||
* See {@link ThreadPoolExecutor#shutdownNow()} for how it handles the shutdown. If <code>true</code> is given to this method it also notifies all {@link ChannelFuture}'s
|
||||
* See {@link ThreadPoolExecutor#shutdownNow()} for how it handles the shutdown.
|
||||
* If <code>true</code> is given to this method it also notifies all {@link ChannelFuture}'s
|
||||
* of the not executed {@link ChannelEventRunnable}'s.
|
||||
*
|
||||
* <p>
|
||||
* Be aware that if you call this with <code>false</code> you will need to handle the notification of the {@link ChannelFuture}'s by your self. So only use this if you
|
||||
* Be aware that if you call this with <code>false</code> you will need to handle the
|
||||
* notification of the {@link ChannelFuture}'s by your self. So only use this if you
|
||||
* really have a use-case for it.
|
||||
* </p>
|
||||
*
|
||||
@ -395,11 +401,13 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
|
||||
}
|
||||
|
||||
/**
|
||||
* If set to <code>false</code> no queued {@link ChannelEventRunnable}'s {@link ChannelFuture} will get notified once {@link #shutdownNow()} is called.
|
||||
* If set to <code>true</code> every queued {@link ChannelEventRunnable} will get marked as failed via {@link ChannelFuture#setFailure(Throwable)}.
|
||||
* If set to <code>false</code> no queued {@link ChannelEventRunnable}'s {@link ChannelFuture}
|
||||
* will get notified once {@link #shutdownNow()} is called. If set to <code>true</code> every
|
||||
* queued {@link ChannelEventRunnable} will get marked as failed via {@link ChannelFuture#setFailure(Throwable)}.
|
||||
*
|
||||
* <p>
|
||||
* Please only set this to <code>false</code> if you want to handle the notification by yourself and know what you are doing. Default is <code>true</code>.
|
||||
* Please only set this to <code>false</code> if you want to handle the notification by yourself
|
||||
* and know what you are doing. Default is <code>true</code>.
|
||||
* </p>
|
||||
*/
|
||||
public void setNotifyChannelFuturesOnShutdown(boolean notifyOnShutdown) {
|
||||
@ -524,8 +532,9 @@ public class MemoryAwareThreadPoolExecutor extends ThreadPoolExecutor {
|
||||
//System.out.println("READABLE");
|
||||
ChannelHandlerContext ctx = eventTask.getContext();
|
||||
if (ctx.getHandler() instanceof ExecutionHandler) {
|
||||
// check if the attachment was set as this means that we suspend the channel from reads. This only works when
|
||||
// this pool is used with ExecutionHandler but I guess thats good enough for us.
|
||||
// check if the attachment was set as this means that we suspend the channel
|
||||
// from reads. This only works when this pool is used with ExecutionHandler
|
||||
// but I guess thats good enough for us.
|
||||
//
|
||||
// See #215
|
||||
if (ctx.getAttachment() != null) {
|
||||
|
@ -28,13 +28,13 @@ import org.jboss.netty.channel.ChannelFutureListener;
|
||||
import org.jboss.netty.util.ObjectSizeEstimator;
|
||||
|
||||
/**
|
||||
* {@link Executor} which should be used for downstream {@link ChannelEvent}'s. This implementation will take care of preserve the order of the events in a {@link Channel}.
|
||||
* If you don't need to preserve the order just use one of the {@link Executor} implementations provided by the static methods of {@link Executors}.
|
||||
* {@link Executor} which should be used for downstream {@link ChannelEvent}'s. This implementation
|
||||
* will take care of preserve the order of the events in a {@link Channel}. If you don't need to
|
||||
* preserve the order just use one of the {@link Executor} implementations provided by the static
|
||||
* methods of {@link Executors}.
|
||||
* <br>
|
||||
* <br>
|
||||
*
|
||||
* For more informations about how the order is preserved see {@link OrderedMemoryAwareThreadPoolExecutor}
|
||||
*
|
||||
*/
|
||||
public final class OrderedDownstreamThreadPoolExecutor extends OrderedMemoryAwareThreadPoolExecutor {
|
||||
|
||||
@ -83,7 +83,8 @@ public final class OrderedDownstreamThreadPoolExecutor extends OrderedMemoryAwar
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory size in this implementation
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory
|
||||
* size in this implementation
|
||||
*/
|
||||
@Override
|
||||
public void setObjectSizeEstimator(ObjectSizeEstimator objectSizeEstimator) {
|
||||
@ -99,7 +100,8 @@ public final class OrderedDownstreamThreadPoolExecutor extends OrderedMemoryAwar
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory size in this implementation
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory
|
||||
* size in this implementation
|
||||
*/
|
||||
@Override
|
||||
public void setMaxChannelMemorySize(long maxChannelMemorySize) {
|
||||
@ -115,7 +117,8 @@ public final class OrderedDownstreamThreadPoolExecutor extends OrderedMemoryAwar
|
||||
}
|
||||
|
||||
/**
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory size in this implementation
|
||||
* Throws {@link UnsupportedOperationException} as there is not support for limit the memory
|
||||
* size in this implementation
|
||||
*/
|
||||
@Override
|
||||
public void setMaxTotalMemorySize(long maxTotalMemorySize) {
|
||||
|
@ -125,7 +125,7 @@ import org.jboss.netty.util.internal.QueueFactory;
|
||||
* </pre>
|
||||
*
|
||||
* If the expected maximum number of keys is small and deterministic, you could
|
||||
* use a weak key map such as <a href="http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/src/jsr166y/ConcurrentWeakHashMap.java?view=markup">ConcurrentWeakHashMap</a>
|
||||
* use a weak key map such as <a href="http://goo.gl/TqGl1">ConcurrentWeakHashMap</a>
|
||||
* or synchronized {@link WeakHashMap} instead of managing the life cycle of the
|
||||
* keys by yourself.
|
||||
*
|
||||
|
@ -30,7 +30,8 @@ import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
* Implementation of Filter of IP based on ALLOW and DENY rules.<br>
|
||||
* <br><br>
|
||||
* This implementation could be changed by implementing a new {@link IpFilterRule} than default
|
||||
* {@link IpV4SubnetFilterRule} (IPV4 support only), {@link IpSubnetFilterRule} (IPV4 and IPV6 support) or {@link IpFilterRule} (IP and host name string pattern support) .<br>
|
||||
* {@link IpV4SubnetFilterRule} (IPV4 support only), {@link IpSubnetFilterRule} (IPV4 and IPV6 support)
|
||||
* or {@link IpFilterRule} (IP and host name string pattern support) .<br>
|
||||
* <br>
|
||||
* The check is done by going from step to step in the underlying array of IpFilterRule.<br>
|
||||
* Each {@link IpFilterRule} answers to the method accept if the {@link InetAddress} is accepted or not,
|
||||
|
@ -18,17 +18,20 @@
|
||||
* Implementation of a Ip based Filter handlers.<br>
|
||||
* <br><br>
|
||||
* <P>The main goal of this package is to allow to filter connections based on IP rules.
|
||||
* The main interface is <tt>{@link org.jboss.netty.handler.ipfilter.IpFilteringHandler}</tt> which all filters will extend.</P>
|
||||
* The main interface is <tt>{@link org.jboss.netty.handler.ipfilter.IpFilteringHandler}</tt> which
|
||||
* all filters will extend.</P>
|
||||
*
|
||||
* <P>Two IP filtering are proposed:<br>
|
||||
* <ul>
|
||||
* <li> <tt>{@link org.jboss.netty.handler.ipfilter.OneIpFilterHandler}</tt>: This filter proposes to allow only one connection by client's IP Address.
|
||||
* I.E. this filter will prevent two connections from the same client based on its IP address.</li><br><br>
|
||||
* <li>{@link org.jboss.netty.handler.ipfilter.OneIpFilterHandler}: This filter proposes to allow
|
||||
* only one connection by client's IP Address. I.E. this filter will prevent two connections
|
||||
* from the same client based on its IP address.</li><br><br>
|
||||
*
|
||||
* <li> <tt>{@link org.jboss.netty.handler.ipfilter.IpFilterRuleHandler}</tt>: This filter proposes to allow or block IP range (based on standard notation
|
||||
* or on CIDR notation) when the connection is running. It relies on another class like
|
||||
* <tt>IpV4SubnetFilterRule</tt> (IPV4 support only), <tt>IpSubnetFilterRule</tt> (IPV4 and IPV6 support) or <tt>PatternRule</tt> (string pattern support)
|
||||
* which implements those Ip ranges.</li><br><br>
|
||||
* <li>{@link org.jboss.netty.handler.ipfilter.IpFilterRuleHandler}: This filter proposes to allow
|
||||
* or block IP range (based on standard notation or on CIDR notation) when the connection is
|
||||
* running. It relies on another class like <tt>IpV4SubnetFilterRule</tt> (IPV4 support only),
|
||||
* <tt>IpSubnetFilterRule</tt> (IPV4 and IPV6 support) or <tt>PatternRule</tt> (string pattern
|
||||
* support) which implements those Ip ranges.</li><br><br>
|
||||
*
|
||||
* </ul></P>
|
||||
*
|
||||
@ -42,27 +45,32 @@
|
||||
* this method is already implemented.<br>
|
||||
* <br>
|
||||
*
|
||||
* <li><tt>handleRefusedChannel</tt> method is executed when the accept method filters (blocks, so returning false)
|
||||
* the new connection. This method allows you to implement specific actions to be taken before the channel is
|
||||
* closed. After this method is called, the channel is immediately closed.</li><br>
|
||||
* So if you want to send back a message to the client, <b>don't forget to return a respectful ChannelFuture,
|
||||
* otherwise the message could be missed since the channel will be closed immediately after this
|
||||
* call and the waiting on this channelFuture</b> (at least with respect of asynchronous operations).<br><br>
|
||||
* Per default implementation this method invokes an {@link org.jboss.netty.handler.ipfilter.IpFilterListener} or returns null if no listener has been set.
|
||||
* <li>handleRefusedChannel method is executed when the accept method filters (blocks, so returning
|
||||
* false) the new connection. This method allows you to implement specific actions to be taken
|
||||
* before the channel is closed. After this method is called, the channel is immediately closed.</li><br>
|
||||
*
|
||||
* So if you want to send back a message to the client, <b>don't forget to return a respectful
|
||||
* ChannelFuture, otherwise the message could be missed since the channel will be closed immediately
|
||||
* after this call and the waiting on this channelFuture</b> (at least with respect of asynchronous
|
||||
* operations).<br><br>
|
||||
* Per default implementation this method invokes an {@link org.jboss.netty.handler.ipfilter.IpFilterListener}
|
||||
* or returns null if no listener has been set.
|
||||
* <br><br>
|
||||
*
|
||||
* <li><tt>continues</tt> is called when any event appears after CONNECTED event and only for
|
||||
* blocked channels.</li><br>
|
||||
* It should return True if this new event has to go to next handlers
|
||||
* in the pipeline if any, and False (default) if no events has to be passed to the next
|
||||
* handlers when a channel is blocked. This is intend to prevent any unnecessary action since the connection is refused.<br>
|
||||
* handlers when a channel is blocked. This is intend to prevent any unnecessary action since the
|
||||
* connection is refused.<br>
|
||||
* However, you could change its behavior for instance because you don't want that any event
|
||||
* will be blocked by this filter by returning always true or according to some events.<br>
|
||||
* <b>Note that OPENED and BOUND events are still passed to the next entry in the pipeline since
|
||||
* those events come out before the CONNECTED event, so there is no possibility to filter those two events
|
||||
* before the CONNECTED event shows up. Therefore, you might want to let CLOSED and UNBOUND be passed
|
||||
* to the next entry in the pipeline.</b><br><br>
|
||||
* Per default implementation this method invokes an {@link org.jboss.netty.handler.ipfilter.IpFilterListener} or returns false if no listener has been set.
|
||||
* Per default implementation this method invokes an {@link org.jboss.netty.handler.ipfilter.IpFilterListener}
|
||||
* or returns false if no listener has been set.
|
||||
* <br><br>
|
||||
*
|
||||
* <li>Finally <tt>handleUpstream</tt> traps the CONNECTED and DISCONNECTED events.</li><br>
|
||||
@ -70,7 +78,8 @@
|
||||
* then any new events on this channel will be blocked.<br>
|
||||
* However, you could change its behavior for instance because you don't want that all events
|
||||
* will be blocked by this filter by testing the result of isBlocked, and if so,
|
||||
* calling <tt>ctx.sendUpstream(e);</tt> after calling the super method or by changing the <tt>continues</tt> method.<br><br>
|
||||
* calling <tt>ctx.sendUpstream(e);</tt> after calling the super method or by changing the
|
||||
* <tt>continues</tt> method.<br><br>
|
||||
|
||||
* </ul></P><br><br>
|
||||
*
|
||||
|
@ -219,7 +219,8 @@ public class BlockingReadHandler<E> extends SimpleChannelUpstreamHandler {
|
||||
* @throws InterruptedException
|
||||
* if the operation has been interrupted
|
||||
*/
|
||||
public ChannelEvent readEvent(long timeout, TimeUnit unit) throws InterruptedException, BlockingReadTimeoutException {
|
||||
public ChannelEvent readEvent(
|
||||
long timeout, TimeUnit unit) throws InterruptedException, BlockingReadTimeoutException {
|
||||
detectDeadLock();
|
||||
if (isClosed()) {
|
||||
if (getQueue().isEmpty()) {
|
||||
|
@ -142,7 +142,8 @@ import org.jboss.netty.util.internal.QueueFactory;
|
||||
* }
|
||||
*
|
||||
* {@literal @Override}
|
||||
* public void channelInterestChanged({@link ChannelHandlerContext} ctx, {@link ChannelStateEvent} e) throws Exception {
|
||||
* public void channelInterestChanged(
|
||||
* {@link ChannelHandlerContext} ctx, {@link ChannelStateEvent} e) throws Exception {
|
||||
* if (e.getChannel().isWritable()) {
|
||||
* flush();
|
||||
* }
|
||||
@ -355,7 +356,8 @@ public class BufferedWriteHandler extends SimpleChannelHandler implements LifeCy
|
||||
}
|
||||
|
||||
/**
|
||||
* Fail all buffered writes that are left. See <a href="https://github.com/netty/netty/issues/308>#308</a> for more details
|
||||
* Fail all buffered writes that are left. See
|
||||
* <a href="https://github.com/netty/netty/issues/308>#308</a> for more details.
|
||||
*/
|
||||
@Override
|
||||
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
|
||||
@ -396,7 +398,8 @@ public class BufferedWriteHandler extends SimpleChannelHandler implements LifeCy
|
||||
}
|
||||
|
||||
/**
|
||||
* Fail all buffered writes that are left. See <a href="https://github.com/netty/netty/issues/308>#308</a> for more details
|
||||
* Fail all buffered writes that are left.
|
||||
* See <a href="https://github.com/netty/netty/issues/308>#308</a> for more details.
|
||||
*/
|
||||
public void afterRemove(ChannelHandlerContext ctx) throws Exception {
|
||||
Throwable cause = null;
|
||||
|
@ -70,9 +70,10 @@ import org.jboss.netty.util.internal.QueueFactory;
|
||||
* <h3>Handshake</h3>
|
||||
* <p>
|
||||
* If {@link #isIssueHandshake()} is {@code false}
|
||||
* (default) you will need to take care of calling {@link #handshake()} by your own. In most situations were {@link SslHandler} is used in 'client mode'
|
||||
* you want to issue a handshake once the connection was established. if {@link #setIssueHandshake(boolean)} is set to <code>true</code> you don't need to
|
||||
* worry about this as the {@link SslHandler} will take care of it.
|
||||
* (default) you will need to take care of calling {@link #handshake()} by your own. In most
|
||||
* situations were {@link SslHandler} is used in 'client mode' you want to issue a handshake once
|
||||
* the connection was established. if {@link #setIssueHandshake(boolean)} is set to <code>true</code>
|
||||
* you don't need to worry about this as the {@link SslHandler} will take care of it.
|
||||
* <p>
|
||||
*
|
||||
* <h3>Renegotiation</h3>
|
||||
@ -91,7 +92,8 @@ import org.jboss.netty.util.internal.QueueFactory;
|
||||
* <ul>
|
||||
* <li><a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555">CVE-2009-3555</a></li>
|
||||
* <li><a href="http://www.ietf.org/rfc/rfc5746.txt">RFC5746</a></li>
|
||||
* <li><a href="http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html">Phased Approach to Fixing the TLS Renegotiation Issue</a></li>
|
||||
* <li><a href="http://www.oracle.com/technetwork/java/javase/documentation/tlsreadme2-176330.html">Phased
|
||||
* Approach to Fixing the TLS Renegotiation Issue</a></li>
|
||||
* </ul>
|
||||
*
|
||||
* <h3>Closing the session</h3>
|
||||
@ -869,7 +871,8 @@ public class SslHandler extends FrameDecoder
|
||||
|
||||
if (result.bytesProduced() > 0) {
|
||||
outNetBuf.flip();
|
||||
ChannelBuffer msg = ctx.getChannel().getConfig().getBufferFactory().getBuffer(outNetBuf.remaining());
|
||||
ChannelBuffer msg =
|
||||
ctx.getChannel().getConfig().getBufferFactory().getBuffer(outNetBuf.remaining());
|
||||
|
||||
|
||||
// Transfer the bytes to the new ChannelBuffer using some safe method that will also
|
||||
@ -939,7 +942,8 @@ public class SslHandler extends FrameDecoder
|
||||
}
|
||||
|
||||
private ChannelBuffer unwrap(
|
||||
ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer, int offset, int length) throws SSLException {
|
||||
ChannelHandlerContext ctx, Channel channel,
|
||||
ChannelBuffer buffer, int offset, int length) throws SSLException {
|
||||
ByteBuffer inNetBuf = buffer.toByteBuffer(offset, length);
|
||||
ByteBuffer outAppBuf = bufferPool.acquireBuffer();
|
||||
|
||||
@ -1275,7 +1279,8 @@ public class SslHandler extends FrameDecoder
|
||||
@Override
|
||||
public void channelConnected(final ChannelHandlerContext ctx, final ChannelStateEvent e) throws Exception {
|
||||
if (issueHandshake) {
|
||||
// issue and handshake and add a listener to it which will fire an exception event if an exception was thrown while doing the handshake
|
||||
// issue and handshake and add a listener to it which will fire an exception event if
|
||||
// an exception was thrown while doing the handshake
|
||||
handshake().addListener(new ChannelFutureListener() {
|
||||
|
||||
public void operationComplete(ChannelFuture future) throws Exception {
|
||||
|
@ -73,7 +73,8 @@ import org.jboss.netty.util.internal.QueueFactory;
|
||||
* @apiviz.landmark
|
||||
* @apiviz.has org.jboss.netty.handler.stream.ChunkedInput oneway - - reads from
|
||||
*/
|
||||
public class ChunkedWriteHandler implements ChannelUpstreamHandler, ChannelDownstreamHandler, LifeCycleAwareChannelHandler {
|
||||
public class ChunkedWriteHandler
|
||||
implements ChannelUpstreamHandler, ChannelDownstreamHandler, LifeCycleAwareChannelHandler {
|
||||
|
||||
private static final InternalLogger logger =
|
||||
InternalLoggerFactory.getInstance(ChunkedWriteHandler.class);
|
||||
@ -251,8 +252,9 @@ public class ChunkedWriteHandler implements ChannelUpstreamHandler, ChannelDowns
|
||||
this.currentEvent = null;
|
||||
writeFuture = currentEvent.getFuture();
|
||||
|
||||
// Register a listener which will close the input once the write is complete. This is needed because the Chunk may have
|
||||
// some resource bound that can not be closed before its not written
|
||||
// Register a listener which will close the input once the write
|
||||
// is complete. This is needed because the Chunk may have some
|
||||
// resource bound that can not be closed before its not written
|
||||
//
|
||||
// See https://github.com/netty/netty/issues/303
|
||||
writeFuture.addListener(new ChannelFutureListener() {
|
||||
|
@ -25,14 +25,16 @@
|
||||
*
|
||||
* <P>Two classes implement this behavior:<br>
|
||||
* <ul>
|
||||
* <li> <tt>{@link org.jboss.netty.handler.traffic.TrafficCounter}</tt>: this class implements the counters needed by the handlers.
|
||||
* It can be accessed to get some extra information like the read or write bytes since last check, the read and write
|
||||
* bandwidth from last check...</li><br><br>
|
||||
* <li>{@link org.jboss.netty.handler.traffic.TrafficCounter}: this class implements the counters
|
||||
* needed by the handlers. It can be accessed to get some extra information like the read or
|
||||
* write bytes since last check, the read and write bandwidth from last check...</li><br><br>
|
||||
*
|
||||
* <li> <tt>{@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}</tt>: this abstract class implements the kernel
|
||||
* of the traffic shaping. It could be extended to fit your needs. Two classes are proposed as default
|
||||
* implementations: see {@link org.jboss.netty.handler.traffic.ChannelTrafficShapingHandler} and see {@link org.jboss.netty.handler.traffic.GlobalTrafficShapingHandler}
|
||||
* respectively for Channel traffic shaping and Global traffic shaping.</li><br><br>
|
||||
* <li>{@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}: this abstract class
|
||||
* implements the kernel of the traffic shaping. It could be extended to fit your needs. Two
|
||||
* classes are proposed as default implementations: see
|
||||
* {@link org.jboss.netty.handler.traffic.ChannelTrafficShapingHandler} and
|
||||
* {@link org.jboss.netty.handler.traffic.GlobalTrafficShapingHandler} respectively for
|
||||
* Channel traffic shaping and Global traffic shaping.</li><br><br>
|
||||
*
|
||||
* The insertion in the pipeline of one of those handlers can be wherever you want, but
|
||||
* <b>it must be placed before any <tt>{@link MemoryAwareThreadPoolExecutor}</tt>
|
||||
@ -62,14 +64,16 @@
|
||||
* [Global or per Channel] [Write or Read] Limitation in byte/s.</li><br>
|
||||
* A value of <tt>0</tt>
|
||||
* stands for no limitation, so the traffic shaping is deactivate (on what you specified).<br>
|
||||
* You can either change those values with the method <tt>configure</tt> in {@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}.<br>
|
||||
* You can either change those values with the method <tt>configure</tt> in
|
||||
* {@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}.<br>
|
||||
* <br>
|
||||
*
|
||||
* <li>To activate or deactivate the statistics, you can adjust the delay to a low (suggested not less than 200ms
|
||||
* for efficiency reasons) or a high value (let say 24H in millisecond is huge enough to not get the problem)
|
||||
* or even using <tt>0</tt> which means no computation will be done.</li><br>
|
||||
* If you want to do anything with this statistics, just override the <tt>doAccounting</tt> method.<br>
|
||||
* This interval can be changed either from the method <tt>configure</tt> in {@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}
|
||||
* This interval can be changed either from the method <tt>configure</tt> in
|
||||
* {@link org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler}
|
||||
* or directly using the method <tt>configure</tt> of {@link org.jboss.netty.handler.traffic.TrafficCounter}.<br><br>
|
||||
*
|
||||
* </ul></P><br><br>
|
||||
@ -81,8 +85,9 @@
|
||||
* <tt>pipeline.addLast("XXXXX_TRAFFIC_SHAPING", myHandler);</tt><br>
|
||||
* <tt>...</tt><br>
|
||||
* <tt>pipeline.addLast("MemoryExecutor",new ExecutionHandler(memoryAwareThreadPoolExecutor));</tt><br><br>
|
||||
* <P>Note that a new {@link org.jboss.netty.handler.traffic.ChannelTrafficShapingHandler} must be created for each new channel,
|
||||
* but only one {@link org.jboss.netty.handler.traffic.GlobalTrafficShapingHandler} must be created for all channels.</P>
|
||||
* <P>Note that a new {@link org.jboss.netty.handler.traffic.ChannelTrafficShapingHandler} must be
|
||||
* created for each new channel, but only one {@link org.jboss.netty.handler.traffic.GlobalTrafficShapingHandler}
|
||||
* must be created for all channels.</P>
|
||||
*
|
||||
* <P>Note also that you can create different GlobalTrafficShapingHandler if you want to separate classes of
|
||||
* channels (for instance either from business point of view or from bind address point of view).</P>
|
||||
|
Loading…
x
Reference in New Issue
Block a user