Example #1
0
 /*
  * 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());
     }
   }
 }
Example #2
0
  /*
   * 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);
    }
  }