Package fi.iki.elonen

Class NanoHTTPD

java.lang.Object
fi.iki.elonen.NanoHTTPD
Direct Known Subclasses:
DebugServer, HelloServer, NanoWSD, RouterNanoHTTPD, SimpleWebServer

public abstract class NanoHTTPD extends Object
A simple, tiny, nicely embeddable HTTP server in Java

NanoHTTPD

Copyright (c) 2012-2013 by Paul S. Hawke, 2001,2005-2013 by Jarno Elonen, 2010 by Konstantinos Togias

Features + limitations:

  • Only one Java file
  • Java 5 compatible
  • Released as open source, Modified BSD licence
  • No fixed config files, logging, authorization etc. (Implement yourself if you need them.)
  • Supports parameter parsing of GET and POST methods (+ rudimentary PUT support in 1.25)
  • Supports both dynamic content and file serving
  • Supports file upload (since version 1.2, 2010)
  • Supports partial content (streaming)
  • Supports ETags
  • Never caches anything
  • Doesn't limit bandwidth, request time or simultaneous connections
  • Default code serves files and shows all HTTP parameters and headers
  • File server supports directory listing, index.html and index.htm
  • File server supports partial content (streaming)
  • File server supports ETags
  • File server does the 301 redirection trick for directories without '/'
  • File server supports simple skipping for files (continue download)
  • File server serves also very long files without memory overhead
  • Contains a built-in list of most common MIME types
  • All header names are converted to lower case so they don't vary between browsers/clients

How to use:

  • Subclass and implement serve() and embed to your own program

See the separate "LICENSE.md" file for the distribution license (Modified BSD licence)

  • Field Details

    • CONTENT_DISPOSITION_REGEX

      private static final String CONTENT_DISPOSITION_REGEX
      See Also:
    • CONTENT_DISPOSITION_PATTERN

      private static final Pattern CONTENT_DISPOSITION_PATTERN
    • CONTENT_TYPE_REGEX

      private static final String CONTENT_TYPE_REGEX
      See Also:
    • CONTENT_TYPE_PATTERN

      private static final Pattern CONTENT_TYPE_PATTERN
    • CONTENT_DISPOSITION_ATTRIBUTE_REGEX

      private static final String CONTENT_DISPOSITION_ATTRIBUTE_REGEX
      See Also:
    • CONTENT_DISPOSITION_ATTRIBUTE_PATTERN

      private static final Pattern CONTENT_DISPOSITION_ATTRIBUTE_PATTERN
    • SOCKET_READ_TIMEOUT

      public static final int SOCKET_READ_TIMEOUT
      Maximum time to wait on Socket.getInputStream().read() (in milliseconds) This is required as the Keep-Alive HTTP connections would otherwise block the socket reading thread forever (or as long the browser is open).
      See Also:
    • MIME_PLAINTEXT

      public static final String MIME_PLAINTEXT
      Common MIME type for dynamic content: plain text
      See Also:
    • MIME_HTML

      public static final String MIME_HTML
      Common MIME type for dynamic content: html
      See Also:
    • QUERY_STRING_PARAMETER

      private static final String QUERY_STRING_PARAMETER
      Pseudo-Parameter to use to store the actual query string in the parameters map for later re-processing.
      See Also:
    • LOG

      private static final Logger LOG
      logger to log to.
    • MIME_TYPES

      protected static Map<String,String> MIME_TYPES
      Hashtable mapping (String)FILENAME_EXTENSION -> (String)MIME_TYPE
    • hostname

      private final String hostname
    • myPort

      private final int myPort
    • myServerSocket

      private volatile ServerSocket myServerSocket
    • serverSocketFactory

      private NanoHTTPD.ServerSocketFactory serverSocketFactory
    • myThread

      private Thread myThread
    • asyncRunner

      protected NanoHTTPD.AsyncRunner asyncRunner
      Pluggable strategy for asynchronously executing requests.
    • tempFileManagerFactory

      private NanoHTTPD.TempFileManagerFactory tempFileManagerFactory
      Pluggable strategy for creating and cleaning up temporary files.
  • Constructor Details

    • NanoHTTPD

      public NanoHTTPD(int port)
      Constructs an HTTP server on given port.
    • NanoHTTPD

      public NanoHTTPD(String hostname, int port)
      Constructs an HTTP server on given hostname and port.
  • Method Details

    • mimeTypes

      public static Map<String,String> mimeTypes()
    • loadMimeTypes

      private static void loadMimeTypes(Map<String,String> result, String resourceName)
    • makeSSLSocketFactory

      public static SSLServerSocketFactory makeSSLSocketFactory(KeyStore loadedKeyStore, KeyManager[] keyManagers) throws IOException
      Creates an SSLSocketFactory for HTTPS. Pass a loaded KeyStore and an array of loaded KeyManagers. These objects must properly loaded/initialized by the caller.
      Throws:
      IOException
    • makeSSLSocketFactory

      public static SSLServerSocketFactory makeSSLSocketFactory(KeyStore loadedKeyStore, KeyManagerFactory loadedKeyFactory) throws IOException
      Creates an SSLSocketFactory for HTTPS. Pass a loaded KeyStore and a loaded KeyManagerFactory. These objects must properly loaded/initialized by the caller.
      Throws:
      IOException
    • makeSSLSocketFactory

      public static SSLServerSocketFactory makeSSLSocketFactory(String keyAndTrustStoreClasspathPath, char[] passphrase) throws IOException
      Creates an SSLSocketFactory for HTTPS. Pass a KeyStore resource with your certificate and passphrase
      Throws:
      IOException
    • getMimeTypeForFile

      public static String getMimeTypeForFile(String uri)
      Get MIME type from file name extension, if possible
      Parameters:
      uri - the string representing a file
      Returns:
      the connected mime/type
    • safeClose

      private static final void safeClose(Object closeable)
    • closeAllConnections

      public void closeAllConnections()
      Forcibly closes all connections that are open.
    • createClientHandler

      protected NanoHTTPD.ClientHandler createClientHandler(Socket finalAccept, InputStream inputStream)
      create a instance of the client handler, subclasses can return a subclass of the ClientHandler.
      Parameters:
      finalAccept - the socket the cleint is connected to
      inputStream - the input stream
      Returns:
      the client handler
    • createServerRunnable

      protected NanoHTTPD.ServerRunnable createServerRunnable(int timeout)
      Instantiate the server runnable, can be overwritten by subclasses to provide a subclass of the ServerRunnable.
      Parameters:
      timeout - the socet timeout to use.
      Returns:
      the server runnable.
    • decodeParameters

      protected static Map<String,List<String>> decodeParameters(Map<String,String> parms)
      Decode parameters from a URL, handing the case where a single parameter name might have been supplied several times, by return lists of values. In general these lists will contain a single element.
      Parameters:
      parms - original NanoHTTPD parameters values, as passed to the serve() method.
      Returns:
      a map of String (parameter name) to List<String> (a list of the values supplied).
    • decodeParameters

      protected static Map<String,List<String>> decodeParameters(String queryString)
      Decode parameters from a URL, handing the case where a single parameter name might have been supplied several times, by return lists of values. In general these lists will contain a single element.
      Parameters:
      queryString - a query string pulled from the URL.
      Returns:
      a map of String (parameter name) to List<String> (a list of the values supplied).
    • decodePercent

      protected static String decodePercent(String str)
      Decode percent encoded String values.
      Parameters:
      str - the percent encoded String
      Returns:
      expanded form of the input, for example "foo%20bar" becomes "foo bar"
    • useGzipWhenAccepted

      protected boolean useGzipWhenAccepted(NanoHTTPD.Response r)
      Returns:
      true if the gzip compression should be used if the client accespts it. Default this option is on for text content and off for everything. Override this for custom semantics.
    • getListeningPort

      public final int getListeningPort()
    • isAlive

      public final boolean isAlive()
    • getServerSocketFactory

      public NanoHTTPD.ServerSocketFactory getServerSocketFactory()
    • setServerSocketFactory

      public void setServerSocketFactory(NanoHTTPD.ServerSocketFactory serverSocketFactory)
    • getHostname

      public String getHostname()
    • getTempFileManagerFactory

      public NanoHTTPD.TempFileManagerFactory getTempFileManagerFactory()
    • makeSecure

      public void makeSecure(SSLServerSocketFactory sslServerSocketFactory, String[] sslProtocols)
      Call before start() to serve over HTTPS instead of HTTP
    • newChunkedResponse

      public static NanoHTTPD.Response newChunkedResponse(NanoHTTPD.Response.IStatus status, String mimeType, InputStream data)
      Create a response with unknown length (using HTTP 1.1 chunking).
    • newFixedLengthResponse

      public static NanoHTTPD.Response newFixedLengthResponse(NanoHTTPD.Response.IStatus status, String mimeType, InputStream data, long totalBytes)
      Create a response with known length.
    • newFixedLengthResponse

      public static NanoHTTPD.Response newFixedLengthResponse(NanoHTTPD.Response.IStatus status, String mimeType, String txt)
      Create a text response with known length.
    • newFixedLengthResponse

      public static NanoHTTPD.Response newFixedLengthResponse(String msg)
      Create a text response with known length.
    • serve

      Override this to customize the server.

      (By default, this returns a 404 "Not Found" plain text error response.)

      Parameters:
      session - The HTTP session
      Returns:
      HTTP response, see class Response for details
    • serve

      @Deprecated public NanoHTTPD.Response serve(String uri, NanoHTTPD.Method method, Map<String,String> headers, Map<String,String> parms, Map<String,String> files)
      Deprecated.
      Override this to customize the server.

      (By default, this returns a 404 "Not Found" plain text error response.)

      Parameters:
      uri - Percent-decoded URI without parameters, for example "/index.cgi"
      method - "GET", "POST" etc.
      headers - Header entries, percent decoded
      parms - Parsed, percent decoded parameters from URI and, in case of POST, data.
      Returns:
      HTTP response, see class Response for details
    • setAsyncRunner

      public void setAsyncRunner(NanoHTTPD.AsyncRunner asyncRunner)
      Pluggable strategy for asynchronously executing requests.
      Parameters:
      asyncRunner - new strategy for handling threads.
    • setTempFileManagerFactory

      public void setTempFileManagerFactory(NanoHTTPD.TempFileManagerFactory tempFileManagerFactory)
      Pluggable strategy for creating and cleaning up temporary files.
      Parameters:
      tempFileManagerFactory - new strategy for handling temp files.
    • start

      public void start() throws IOException
      Start the server.
      Throws:
      IOException - if the socket is in use.
    • start

      public void start(int timeout) throws IOException
      Starts the server (in setDaemon(true) mode).
      Throws:
      IOException
    • start

      public void start(int timeout, boolean daemon) throws IOException
      Start the server.
      Parameters:
      timeout - timeout to use for socket connections.
      daemon - start the thread daemon or not.
      Throws:
      IOException - if the socket is in use.
    • stop

      public void stop()
      Stop the server.
    • wasStarted

      public final boolean wasStarted()