docs: private NanoHTTPD.Response getResource(String uri) {
      byte[] bytes = _cache.get(uri);
      if( bytes == null ) {
        InputStream resource = Boot._init.getResource2(uri);
        if (resource != null) {
          try {
            bytes = ByteStreams.toByteArray(resource);
          } catch( IOException e ) { Log.err(e); }
          byte[] res = _cache.putIfAbsent(uri,bytes);
          if( res != null ) bytes = res; // Racey update; take what is in the _cache
        }
        Closeables.closeQuietly(resource);
      }
      if ((bytes == null) || (bytes.length == 0)) {
        // make sure that no Exception is ever thrown out from the request
        Properties parms = new Properties();
        parms.setProperty(Request.ERROR,uri);
        return _http404.serve(this,parms,Request.RequestType.www);
      }
      String mime = NanoHTTPD.MIME_DEFAULT_BINARY;
      if (uri.endsWith(".css"))
        mime = "text/css";
      else if (uri.endsWith(".html"))
        mime = "text/html";
      // return new NanoHTTPD.Response(NanoHTTPD.HTTP_OK,mime,new ByteArrayInputStream(bytes));
      NanoHTTPD.Response res = new NanoHTTPD.Response(NanoHTTPD.HTTP_OK,mime,new ByteArrayInputStream(bytes));
      res.addHeader("Content-Length", Long.toString(bytes.length));
      // res.addHeader("Content-Disposition", "attachment; filename=" + uri);
      return res;
    }