/
DelegatingHttpRequestHandler.java
78 lines (71 loc) · 2.84 KB
/
DelegatingHttpRequestHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package org.jetbrains.io;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.util.IconLoader;
import org.apache.sanselan.ImageFormat;
import org.apache.sanselan.Sanselan;
import org.jboss.netty.channel.*;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.QueryStringDecoder;
import org.jetbrains.ide.HttpRequestHandler;
import org.jetbrains.ide.WebServerManager;
import javax.swing.*;
import java.awt.image.BufferedImage;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
@ChannelHandler.Sharable
final class DelegatingHttpRequestHandler extends SimpleChannelUpstreamHandler {
@Override
public void messageReceived(ChannelHandlerContext context, MessageEvent event) throws Exception {
if (!(event.getMessage() instanceof HttpRequest)) {
context.sendUpstream(event);
return;
}
HttpRequest request = (HttpRequest)event.getMessage();
QueryStringDecoder urlDecoder = new QueryStringDecoder(request.getUri());
HttpRequestHandler connectedHandler = (HttpRequestHandler)context.getAttachment();
if (connectedHandler == null) {
if (urlDecoder.getPath().equals("/favicon.ico")) {
Icon icon = IconLoader.findIcon(ApplicationInfoEx.getInstanceEx().getSmallIconUrl());
if (icon != null) {
//noinspection UndesirableClassUsage
BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
icon.paintIcon(null, image.getGraphics(), 0, 0);
byte[] icoBytes = Sanselan.writeImageToBytes(image, ImageFormat.IMAGE_FORMAT_ICO, null);
Responses.send(icoBytes, FileResponses.createResponse(urlDecoder.getPath()), request, context);
return;
}
}
else if (urlDecoder.getPath().equals(WebServer.START_TIME_PATH)) {
Responses.send(WebServer.getApplicationStartTime(), request, context);
return;
}
for (HttpRequestHandler handler : WebServerManager.EP_NAME.getExtensions()) {
try {
if (handler.isSupported(request) && handler.process(urlDecoder, request, context)) {
if (context.getAttachment() == null) {
context.setAttachment(handler);
}
return;
}
}
catch (Throwable e) {
WebServer.LOG.error(e);
}
}
}
else if (connectedHandler.isSupported(request)) {
connectedHandler.process(urlDecoder, request, context);
return;
}
Responses.sendStatus(request, context, NOT_FOUND);
}
@Override
public void exceptionCaught(ChannelHandlerContext context, ExceptionEvent event) throws Exception {
try {
WebServer.LOG.error(event.getCause());
}
finally {
context.setAttachment(null);
event.getChannel().close();
}
}
}