public void doGeneric(String method, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { startTransaction(request.getHeader("User-Agent")); // Marshal Jetty request parameters to Nano-style. // Note that getServletPath does an un-escape so that the %24 of job id's are turned into $ // characters. String uri = request.getServletPath(); Properties headers = new Properties(); Enumeration<String> en = request.getHeaderNames(); while (en.hasMoreElements()) { String key = en.nextElement(); String value = request.getHeader(key); headers.put(key, value); } Properties parms = new Properties(); Map<String, String[]> parameterMap; parameterMap = request.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String key = entry.getKey(); String[] values = entry.getValue(); for (String value : values) { parms.put(key, value); } } // Make Nano call. NanoHTTPD.Response resp = water.api.RequestServer.SERVER.serve(uri, method, headers, parms); // Un-marshal Nano response back to Jetty. String choppedNanoStatus = resp.status.substring(0, 3); assert (choppedNanoStatus.length() == 3); int sc = Integer.parseInt(choppedNanoStatus); setResponseStatus(response, sc); response.setContentType(resp.mimeType); Properties header = resp.header; Enumeration<Object> en2 = header.keys(); while (en2.hasMoreElements()) { String key = (String) en2.nextElement(); String value = header.getProperty(key); response.setHeader(key, value); } OutputStream os = response.getOutputStream(); if (resp instanceof NanoHTTPD.StreamResponse) { NanoHTTPD.StreamResponse ssr = (NanoHTTPD.StreamResponse) resp; ssr.streamWriter.writeTo(os); } else { InputStream is = resp.data; FileUtils.copyStream(is, os, 1024); } } finally { logRequest(method, request, response); // Handle shutdown if it was requested. if (H2O.getShutdownRequested()) { (new Thread() { public void run() { boolean[] confirmations = new boolean[H2O.CLOUD.size()]; if (H2O.SELF.index() >= 0) { confirmations[H2O.SELF.index()] = true; } for (H2ONode n : H2O.CLOUD._memary) { if (n != H2O.SELF) new RPC(n, new ShutdownTsk(H2O.SELF, n.index(), 1000, confirmations)).call(); } try { Thread.sleep(2000); } catch (Exception ignore) { } int failedToShutdown = 0; // shutdown failed for (boolean b : confirmations) if (!b) failedToShutdown++; Log.info( "Orderly shutdown: " + (failedToShutdown > 0 ? failedToShutdown + " nodes failed to shut down! " : "") + " Shutting down now."); H2O.closeAll(); H2O.exit(failedToShutdown); } }) .start(); } endTransaction(); } }