// IDEA-91436 idea <121 binds to 127.0.0.1, but >=121 must be available not only from localhost // but if we bind only to any local port (0.0.0.0), instance of idea <121 can bind to our ports // and any request to us will be intercepted // so, we bind to 127.0.0.1 and 0.0.0.0 private int bind(int firstPort, int portsCount, boolean tryAnyPort, ServerBootstrap bootstrap) { InetAddress localAddress; try { localAddress = InetAddress.getByName("127.0.0.1"); } catch (UnknownHostException e) { LOG.error(e); return -1; } for (int i = 0; i < portsCount; i++) { int port = firstPort + i; try { openChannels.add(bootstrap.bind(new InetSocketAddress(localAddress, port))); return port; } catch (ChannelException e) { if (!openChannels.isEmpty()) { openChannels.close(); openChannels.clear(); } if (portsCount == 1) { throw e; } else if (!tryAnyPort && i == (portsCount - 1)) { LOG.error(e); } } } if (tryAnyPort) { LOG.info("We cannot bind to our default range, so, try to bind to any free port"); try { Channel channel = bootstrap.bind(new InetSocketAddress(localAddress, 0)); openChannels.add(channel); return ((InetSocketAddress) channel.getLocalAddress()).getPort(); } catch (ChannelException e) { LOG.error(e); } } return -1; }
public boolean isRunning() { return !openChannels.isEmpty(); }
// IDEA-91436 idea <121 binds to 127.0.0.1, but >=121 must be available not only from localhost // but if we bind only to any local port (0.0.0.0), instance of idea <121 can bind to our ports // and any request to us will be intercepted // so, we bind to 127.0.0.1 and 0.0.0.0 private int bind(int firstPort, int portsCount, boolean tryAnyPort, ServerBootstrap bootstrap) { String property = System.getProperty(PROPERTY_ONLY_ANY_HOST); boolean onlyAnyHost = property == null ? (SystemInfo.isLinux || SystemInfo.isWindows && !SystemInfo.isWinVistaOrNewer) : (property.isEmpty() || Boolean.valueOf(property)); boolean portChecked = false; for (int i = 0; i < portsCount; i++) { int port = firstPort + i; ChannelException channelException = null; try { openChannels.add(bootstrap.bind(new InetSocketAddress(port))); if (!onlyAnyHost) { InetSocketAddress localAddress = null; try { localAddress = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), port); openChannels.add(bootstrap.bind(localAddress)); } catch (UnknownHostException ignored) { return port; } catch (ChannelException e) { channelException = e; if (!portChecked) { portChecked = true; assert localAddress != null; if (checkPortSafe(localAddress)) { return port; } } } } } catch (ChannelException e) { channelException = e; } if (channelException == null) { return port; } else { if (!openChannels.isEmpty()) { openChannels.close(); openChannels.clear(); } if (portsCount == 1) { throw channelException; } else if (!tryAnyPort && i == (portsCount - 1)) { LOG.error(channelException); } } } if (tryAnyPort) { LOG.info("We cannot bind to our default range, so, try to bind to any free port"); try { Channel channel = bootstrap.bind(new InetSocketAddress(0)); openChannels.add(channel); return ((InetSocketAddress) channel.getLocalAddress()).getPort(); } catch (ChannelException e) { LOG.error(e); } } return -1; }