() {
@@ -57,7 +53,7 @@ public final class Responses {
private static String SERVER_HEADER_VALUE;
public static void addAllowAnyOrigin(HttpResponse response) {
- response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
+ response.headers().add(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
}
public static void addDate(HttpResponse response) {
@@ -65,7 +61,12 @@ public final class Responses {
}
public static void addDate(HttpResponse response, Date date) {
- response.setHeader(DATE, DATE_FORMAT.get().format(date));
+ response.headers().add(DATE, DATE_FORMAT.get().format(date));
+ }
+
+ public static void addNoCache(HttpResponse response) {
+ response.headers().add(CACHE_CONTROL, "no-cache, no-store, must-revalidate, max-age=0");
+ response.headers().add(PRAGMA, "no-cache");
}
@Nullable
@@ -81,32 +82,29 @@ public final class Responses {
public static void addServer(HttpResponse response) {
if (getServerHeaderValue() != null) {
- response.setHeader(SERVER, getServerHeaderValue());
+ response.headers().add(SERVER, getServerHeaderValue());
}
}
- public static void send(String contentType, CharSequence content, HttpRequest request, ChannelHandlerContext context) {
- HttpResponse response = create(contentType);
- response.setContent(ChannelBuffers.copiedBuffer(content, CharsetUtil.UTF_8));
- send(response, request, context);
- }
-
- public static void send(HttpResponse response, @Nullable HttpRequest request, ChannelHandlerContext context) {
- send(response, context.getChannel(), request);
+ public static void send(String contentType, CharSequence content, Channel channel, HttpRequest request) {
+ send(create(contentType, Unpooled.copiedBuffer(content, CharsetUtil.UTF_8)), channel, request);
}
public static void send(HttpResponse response, Channel channel, @Nullable HttpRequest request) {
- ChannelBuffer content = response.getContent();
- setContentLength(response, content == ChannelBuffers.EMPTY_BUFFER ? 0 : content.readableBytes());
+ if (response instanceof FullHttpResponse) {
+ HttpHeaders.setContentLength(response, ((FullHttpResponse)response).content().readableBytes());
+ }
+ else {
+ HttpHeaders.setContentLength(response, 0);
+ }
- boolean keepAlive = request != null && addKeepAliveIfNeed(response, request);
addCommonHeaders(response);
- send(response, channel, !keepAlive);
+ send(response, channel, request != null && !addKeepAliveIfNeed(response, request));
}
public static boolean addKeepAliveIfNeed(HttpResponse response, HttpRequest request) {
- if (isKeepAlive(request)) {
- response.setHeader(CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
+ if (HttpHeaders.isKeepAlive(request)) {
+ HttpHeaders.setKeepAlive(response, true);
return true;
}
return false;
@@ -119,32 +117,33 @@ public final class Responses {
}
public static HttpResponse create(String contentType) {
- HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
- response.setHeader(CONTENT_TYPE, contentType);
+ return create(contentType, null);
+ }
+
+ public static HttpResponse create(@Nullable String contentType, @Nullable ByteBuf content) {
+ HttpResponse response = content == null
+ ? new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)
+ : new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content);
+ if (contentType != null) {
+ response.headers().add(CONTENT_TYPE, contentType);
+ }
return response;
}
- public static void send(CharSequence content, HttpRequest request, ChannelHandlerContext context) {
- send(content, CharsetUtil.US_ASCII, request, context);
+ public static void send(CharSequence content, Channel channel, @Nullable HttpRequest request) {
+ send(content, CharsetUtil.US_ASCII, channel, request);
}
- public static void send(CharSequence content, Charset charset, HttpRequest request, ChannelHandlerContext context) {
- DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
- response.setContent(ChannelBuffers.copiedBuffer(content, charset));
- send(response, request, context);
+ public static void send(CharSequence content, Charset charset, Channel channel, @Nullable HttpRequest request) {
+ send(create(null, Unpooled.copiedBuffer(content, charset)), channel, request);
}
- public static void send(byte[] bytes, HttpResponse response, HttpRequest request, ChannelHandlerContext context) {
- response.setContent(ChannelBuffers.wrappedBuffer(bytes));
- send(response, request, context);
- }
-
- public static void send(HttpResponse response, ChannelHandlerContext context) {
- send(response, context.getChannel(), true);
+ public static void send(HttpResponse response, Channel channel) {
+ send(response, channel, true);
}
public static void send(HttpResponseStatus status, ChannelHandlerContext context) {
- send(new DefaultHttpResponse(HTTP_1_1, status), context);
+ send(new DefaultHttpResponse(HttpVersion.HTTP_1_1, status), context.channel());
}
private static void send(HttpResponse response, Channel channel, boolean close) {
@@ -152,50 +151,52 @@ public final class Responses {
return;
}
- ChannelFuture future = channel.write(response);
+ ChannelFuture future = channel.writeAndFlush(response);
if (close) {
future.addListener(ChannelFutureListener.CLOSE);
}
}
- public static void sendStatus(HttpRequest request, Channel channel, HttpResponseStatus responseStatus, @Nullable String description) {
- sendStatus(new DefaultHttpResponse(HTTP_1_1, responseStatus), request, channel, description);
+ public static void sendStatus(HttpResponseStatus responseStatus, Channel channel) {
+ sendStatus(null, channel, responseStatus);
}
- public static void sendStatus(HttpRequest request, Channel channel, HttpResponseStatus responseStatus) {
+ public static void sendStatus(@Nullable HttpRequest request, Channel channel, HttpResponseStatus responseStatus) {
sendStatus(request, channel, responseStatus, null);
}
+ public static void sendStatus(@Nullable HttpRequest request, Channel channel, HttpResponseStatus responseStatus, @Nullable String description) {
+ send(createStatusResponse(responseStatus, request, description), channel, request);
+ }
+
public static void sendStatus(HttpResponse response, HttpRequest request, Channel channel) {
- sendStatus(response, request, channel, null);
- }
-
- public static void sendStatus(HttpResponseStatus responseStatus, Channel channel) {
- sendStatus(new DefaultHttpResponse(HTTP_1_1, responseStatus), null, channel, null);
- }
-
- private static void sendStatus(HttpResponse response, @Nullable HttpRequest request, Channel channel, @Nullable String description) {
- response.setHeader(CONTENT_TYPE, "text/html");
- if (request == null || request.getMethod() != HttpMethod.HEAD) {
- String message = response.getStatus().toString();
-
- StringBuilder builder = new StringBuilder();
- builder.append("").append(message).append("").append("").append(message).append("
");
- if (description != null) {
- builder.append("").append(description).append("
");
- }
- builder.append("
").append(StringUtil.notNullize(getServerHeaderValue(), "")).append("
");
-
- response.setContent(ChannelBuffers.copiedBuffer(builder, CharsetUtil.UTF_8));
- }
+ response.headers().set(CONTENT_TYPE, "text/html");
send(response, channel, request);
}
+ private static HttpResponse createStatusResponse(HttpResponseStatus responseStatus, @Nullable HttpRequest request, @Nullable String description) {
+ if (request != null && request.getMethod() == HttpMethod.HEAD) {
+ return new DefaultHttpResponse(HttpVersion.HTTP_1_1, responseStatus);
+ }
+
+ StringBuilder builder = new StringBuilder();
+ String message = responseStatus.toString();
+ builder.append("").append(message).append("").append("").append(message).append("
");
+ if (description != null) {
+ builder.append("").append(description).append("
");
+ }
+ builder.append("
").append(StringUtil.notNullize(getServerHeaderValue(), "")).append("
");
+
+ DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, responseStatus, Unpooled.copiedBuffer(builder, CharsetUtil.UTF_8));
+ response.headers().set(CONTENT_TYPE, "text/html");
+ return response;
+ }
+
public static void sendOptionsResponse(String allowHeaders, HttpRequest request, ChannelHandlerContext context) {
- HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
- response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
- response.setHeader(ACCESS_CONTROL_ALLOW_METHODS, allowHeaders);
- response.setHeader(ALLOW, allowHeaders);
- send(response, request, context);
+ HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
+ addAllowAnyOrigin(response);
+ response.headers().set(ACCESS_CONTROL_ALLOW_METHODS, allowHeaders);
+ response.headers().set(ALLOW, allowHeaders);
+ send(response, context.channel(), request);
}
}
\ No newline at end of file
diff --git a/platform/platform-impl/src/org/jetbrains/io/SubServer.java b/platform/platform-impl/src/org/jetbrains/io/SubServer.java
index 12512be2efd4..ee070e75f453 100644
--- a/platform/platform-impl/src/org/jetbrains/io/SubServer.java
+++ b/platform/platform-impl/src/org/jetbrains/io/SubServer.java
@@ -17,24 +17,23 @@ package org.jetbrains.io;
import com.intellij.openapi.Disposable;
import com.intellij.util.net.NetUtils;
-import org.jboss.netty.bootstrap.ServerBootstrap;
-import org.jboss.netty.channel.group.ChannelGroup;
-import org.jboss.netty.channel.group.DefaultChannelGroup;
-import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.channel.EventLoopGroup;
import org.jetbrains.ide.BuiltInServerManager;
import org.jetbrains.ide.CustomPortServerManager;
import java.net.InetSocketAddress;
final class SubServer implements CustomPortServerManager.CustomPortService, Disposable {
- private final ChannelGroup openChannels = new DefaultChannelGroup();
+ private final ChannelRegistrar channelRegistrar = new ChannelRegistrar();
+
private final CustomPortServerManager user;
private final ServerBootstrap bootstrap;
- public SubServer(CustomPortServerManager user, NioServerSocketChannelFactory channelFactory) {
+ public SubServer(CustomPortServerManager user, EventLoopGroup eventLoopGroup) {
this.user = user;
user.setManager(this);
- bootstrap = BuiltInServer.createServerBootstrap(channelFactory, openChannels, user.createXmlRpcHandlers());
+ bootstrap = BuiltInServer.createServerBootstrap(eventLoopGroup, channelRegistrar, user.createXmlRpcHandlers());
}
public boolean bind(int port) {
@@ -43,7 +42,8 @@ final class SubServer implements CustomPortServerManager.CustomPortService, Disp
}
try {
- openChannels.add(bootstrap.bind(user.isAvailableExternally() ? new InetSocketAddress(port) : new InetSocketAddress(NetUtils.getLoopbackAddress(), port)));
+ bootstrap.localAddress(user.isAvailableExternally() ? new InetSocketAddress(port) : new InetSocketAddress(NetUtils.getLoopbackAddress(), port));
+ channelRegistrar.add(bootstrap.bind().syncUninterruptibly().channel());
return true;
}
catch (Exception e) {
@@ -55,12 +55,11 @@ final class SubServer implements CustomPortServerManager.CustomPortService, Disp
@Override
public boolean isBound() {
- return !openChannels.isEmpty();
+ return !channelRegistrar.isEmpty();
}
private void stop() {
- openChannels.close().awaitUninterruptibly();
- openChannels.clear();
+ channelRegistrar.close(false);
}
@Override
diff --git a/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/ServerTaskExecutorImpl.java b/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/ServerTaskExecutorImpl.java
index 43722962fcbd..d9c717fd4125 100644
--- a/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/ServerTaskExecutorImpl.java
+++ b/platform/remote-servers/impl/src/com/intellij/remoteServer/impl/runtime/ServerTaskExecutorImpl.java
@@ -13,11 +13,10 @@ import org.jetbrains.ide.PooledThreadExecutor;
*/
public class ServerTaskExecutorImpl implements ServerTaskExecutor {
private static final Logger LOG = Logger.getInstance(ServerTaskExecutorImpl.class);
- private static final PooledThreadExecutor POOLED_THREAD_EXECUTOR = new PooledThreadExecutor();
private final SequentialTaskExecutor myTaskExecutor;
public ServerTaskExecutorImpl() {
- myTaskExecutor = new SequentialTaskExecutor(POOLED_THREAD_EXECUTOR);
+ myTaskExecutor = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE);
}
@Override