/* * Removes a context. If the server doesn't have anymore contexts, it * would stop the server and server is removed from servers Map. */ /*package*/ void removeContext(HttpContext context) { InetSocketAddress inetAddress = context.getServer().getAddress(); synchronized (servers) { ServerState state = servers.get(inetAddress); int instances = state.noOfContexts(); if (instances < 2) { ((ExecutorService) state.getServer().getExecutor()).shutdown(); state.getServer().stop(0); servers.remove(inetAddress); } else { state.getServer().removeContext(context); state.oneLessContext(context.getPath()); } } }
/* * Creates a HttpContext at the given address. If there is already a server * it uses that server to create a context. Otherwise, it creates a new * HTTP server. This sever is added to servers Map. */ /*package*/ HttpContext createContext(String address) { try { HttpServer server; ServerState state; URL url = new URL(address); int port = url.getPort(); if (port == -1) { port = url.getDefaultPort(); } InetSocketAddress inetAddress = new InetSocketAddress(url.getHost(), port); synchronized (servers) { state = servers.get(inetAddress); if (state == null) { logger.fine("Creating new HTTP Server at " + inetAddress); // Creates server with default socket backlog server = HttpServer.create(inetAddress, 0); server.setExecutor(Executors.newCachedThreadPool()); String path = url.toURI().getPath(); logger.fine("Creating HTTP Context at = " + path); HttpContext context = server.createContext(path); server.start(); // we have to get actual inetAddress from server, which can differ from the original in // some cases. // e.g. A port number of zero will let the system pick up an ephemeral port in a bind // operation, // or IP: 0.0.0.0 - which is used to monitor network traffic from any valid IP address inetAddress = server.getAddress(); logger.fine("HTTP server started = " + inetAddress); state = new ServerState(server, path); servers.put(inetAddress, state); return context; } } server = state.getServer(); if (state.getPaths().contains(url.getPath())) { String err = "Context with URL path " + url.getPath() + " already exists on the server " + server.getAddress(); logger.fine(err); throw new IllegalArgumentException(err); } logger.fine("Creating HTTP Context at = " + url.getPath()); HttpContext context = server.createContext(url.getPath()); state.oneMoreContext(url.getPath()); return context; } catch (Exception e) { throw new ServerRtException("server.rt.err", e); } }