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 java.lang.ObjectA simple, tiny, nicely embeddable HTTP server in Java NanoHTTPDCopyright (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
- Subclass and implement serve() and embed to your own program
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceNanoHTTPD.AsyncRunnerPluggable strategy for asynchronously executing requests.classNanoHTTPD.ClientHandlerThe runnable that will be used for every new client connection.protected static classNanoHTTPD.ContentTypestatic classNanoHTTPD.CookieclassNanoHTTPD.CookieHandlerProvides rudimentary support for cookies.static classNanoHTTPD.DefaultAsyncRunnerDefault threading strategy for NanoHTTPD.static classNanoHTTPD.DefaultServerSocketFactoryCreates a normal ServerSocket for TCP connectionsstatic classNanoHTTPD.DefaultTempFileDefault strategy for creating and cleaning up temporary files.static classNanoHTTPD.DefaultTempFileManagerDefault strategy for creating and cleaning up temporary files.private classNanoHTTPD.DefaultTempFileManagerFactoryDefault strategy for creating and cleaning up temporary files.protected classNanoHTTPD.HTTPSessionstatic interfaceNanoHTTPD.IHTTPSessionHandles one session, i.e.static classNanoHTTPD.MethodHTTP Request methods, with the ability to decode aStringback to its enum value.static classNanoHTTPD.ResponseHTTP response.static classNanoHTTPD.ResponseExceptionstatic classNanoHTTPD.SecureServerSocketFactoryCreates a new SSLServerSocketclassNanoHTTPD.ServerRunnableThe runnable that will be used for the main listening thread.static interfaceNanoHTTPD.ServerSocketFactoryFactory to create ServerSocketFactories.static interfaceNanoHTTPD.TempFileA temp file.static interfaceNanoHTTPD.TempFileManagerTemp file manager.static interfaceNanoHTTPD.TempFileManagerFactoryFactory to create temp file managers.
-
Field Summary
Fields Modifier and Type Field Description protected NanoHTTPD.AsyncRunnerasyncRunnerPluggable strategy for asynchronously executing requests.private static java.util.regex.PatternCONTENT_DISPOSITION_ATTRIBUTE_PATTERNprivate static java.lang.StringCONTENT_DISPOSITION_ATTRIBUTE_REGEXprivate static java.util.regex.PatternCONTENT_DISPOSITION_PATTERNprivate static java.lang.StringCONTENT_DISPOSITION_REGEXprivate static java.util.regex.PatternCONTENT_TYPE_PATTERNprivate static java.lang.StringCONTENT_TYPE_REGEXprivate java.lang.Stringhostnameprivate static java.util.logging.LoggerLOGlogger to log to.static java.lang.StringMIME_HTMLCommon MIME type for dynamic content: htmlstatic java.lang.StringMIME_PLAINTEXTCommon MIME type for dynamic content: plain textprotected static java.util.Map<java.lang.String,java.lang.String>MIME_TYPESHashtable mapping (String)FILENAME_EXTENSION -> (String)MIME_TYPEprivate intmyPortprivate java.net.ServerSocketmyServerSocketprivate java.lang.ThreadmyThreadprivate static java.lang.StringQUERY_STRING_PARAMETERPseudo-Parameter to use to store the actual query string in the parameters map for later re-processing.private NanoHTTPD.ServerSocketFactoryserverSocketFactorystatic intSOCKET_READ_TIMEOUTMaximum 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).private NanoHTTPD.TempFileManagerFactorytempFileManagerFactoryPluggable strategy for creating and cleaning up temporary files.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidcloseAllConnections()Forcibly closes all connections that are open.protected NanoHTTPD.ClientHandlercreateClientHandler(java.net.Socket finalAccept, java.io.InputStream inputStream)create a instance of the client handler, subclasses can return a subclass of the ClientHandler.protected NanoHTTPD.ServerRunnablecreateServerRunnable(int timeout)Instantiate the server runnable, can be overwritten by subclasses to provide a subclass of the ServerRunnable.protected static java.util.Map<java.lang.String,java.util.List<java.lang.String>>decodeParameters(java.lang.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.protected static java.util.Map<java.lang.String,java.util.List<java.lang.String>>decodeParameters(java.util.Map<java.lang.String,java.lang.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.protected static java.lang.StringdecodePercent(java.lang.String str)Decode percent encodedStringvalues.java.lang.StringgetHostname()intgetListeningPort()static java.lang.StringgetMimeTypeForFile(java.lang.String uri)Get MIME type from file name extension, if possibleNanoHTTPD.ServerSocketFactorygetServerSocketFactory()NanoHTTPD.TempFileManagerFactorygetTempFileManagerFactory()booleanisAlive()private static voidloadMimeTypes(java.util.Map<java.lang.String,java.lang.String> result, java.lang.String resourceName)voidmakeSecure(javax.net.ssl.SSLServerSocketFactory sslServerSocketFactory, java.lang.String[] sslProtocols)Call before start() to serve over HTTPS instead of HTTPstatic javax.net.ssl.SSLServerSocketFactorymakeSSLSocketFactory(java.lang.String keyAndTrustStoreClasspathPath, char[] passphrase)Creates an SSLSocketFactory for HTTPS.static javax.net.ssl.SSLServerSocketFactorymakeSSLSocketFactory(java.security.KeyStore loadedKeyStore, javax.net.ssl.KeyManager[] keyManagers)Creates an SSLSocketFactory for HTTPS.static javax.net.ssl.SSLServerSocketFactorymakeSSLSocketFactory(java.security.KeyStore loadedKeyStore, javax.net.ssl.KeyManagerFactory loadedKeyFactory)Creates an SSLSocketFactory for HTTPS.static java.util.Map<java.lang.String,java.lang.String>mimeTypes()static NanoHTTPD.ResponsenewChunkedResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.io.InputStream data)Create a response with unknown length (using HTTP 1.1 chunking).static NanoHTTPD.ResponsenewFixedLengthResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.io.InputStream data, long totalBytes)Create a response with known length.static NanoHTTPD.ResponsenewFixedLengthResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.lang.String txt)Create a text response with known length.static NanoHTTPD.ResponsenewFixedLengthResponse(java.lang.String msg)Create a text response with known length.private static voidsafeClose(java.lang.Object closeable)NanoHTTPD.Responseserve(NanoHTTPD.IHTTPSession session)Override this to customize the server.NanoHTTPD.Responseserve(java.lang.String uri, NanoHTTPD.Method method, java.util.Map<java.lang.String,java.lang.String> headers, java.util.Map<java.lang.String,java.lang.String> parms, java.util.Map<java.lang.String,java.lang.String> files)Deprecated.voidsetAsyncRunner(NanoHTTPD.AsyncRunner asyncRunner)Pluggable strategy for asynchronously executing requests.voidsetServerSocketFactory(NanoHTTPD.ServerSocketFactory serverSocketFactory)voidsetTempFileManagerFactory(NanoHTTPD.TempFileManagerFactory tempFileManagerFactory)Pluggable strategy for creating and cleaning up temporary files.voidstart()Start the server.voidstart(int timeout)Starts the server (in setDaemon(true) mode).voidstart(int timeout, boolean daemon)Start the server.voidstop()Stop the server.protected booleanuseGzipWhenAccepted(NanoHTTPD.Response r)booleanwasStarted()
-
-
-
Field Detail
-
CONTENT_DISPOSITION_REGEX
private static final java.lang.String CONTENT_DISPOSITION_REGEX
- See Also:
- Constant Field Values
-
CONTENT_DISPOSITION_PATTERN
private static final java.util.regex.Pattern CONTENT_DISPOSITION_PATTERN
-
CONTENT_TYPE_REGEX
private static final java.lang.String CONTENT_TYPE_REGEX
- See Also:
- Constant Field Values
-
CONTENT_TYPE_PATTERN
private static final java.util.regex.Pattern CONTENT_TYPE_PATTERN
-
CONTENT_DISPOSITION_ATTRIBUTE_REGEX
private static final java.lang.String CONTENT_DISPOSITION_ATTRIBUTE_REGEX
- See Also:
- Constant Field Values
-
CONTENT_DISPOSITION_ATTRIBUTE_PATTERN
private static final java.util.regex.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:
- Constant Field Values
-
MIME_PLAINTEXT
public static final java.lang.String MIME_PLAINTEXT
Common MIME type for dynamic content: plain text- See Also:
- Constant Field Values
-
MIME_HTML
public static final java.lang.String MIME_HTML
Common MIME type for dynamic content: html- See Also:
- Constant Field Values
-
QUERY_STRING_PARAMETER
private static final java.lang.String QUERY_STRING_PARAMETER
Pseudo-Parameter to use to store the actual query string in the parameters map for later re-processing.- See Also:
- Constant Field Values
-
LOG
private static final java.util.logging.Logger LOG
logger to log to.
-
MIME_TYPES
protected static java.util.Map<java.lang.String,java.lang.String> MIME_TYPES
Hashtable mapping (String)FILENAME_EXTENSION -> (String)MIME_TYPE
-
hostname
private final java.lang.String hostname
-
myPort
private final int myPort
-
myServerSocket
private volatile java.net.ServerSocket myServerSocket
-
serverSocketFactory
private NanoHTTPD.ServerSocketFactory serverSocketFactory
-
myThread
private java.lang.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.
-
-
Method Detail
-
mimeTypes
public static java.util.Map<java.lang.String,java.lang.String> mimeTypes()
-
loadMimeTypes
private static void loadMimeTypes(java.util.Map<java.lang.String,java.lang.String> result, java.lang.String resourceName)
-
makeSSLSocketFactory
public static javax.net.ssl.SSLServerSocketFactory makeSSLSocketFactory(java.security.KeyStore loadedKeyStore, javax.net.ssl.KeyManager[] keyManagers) throws java.io.IOExceptionCreates an SSLSocketFactory for HTTPS. Pass a loaded KeyStore and an array of loaded KeyManagers. These objects must properly loaded/initialized by the caller.- Throws:
java.io.IOException
-
makeSSLSocketFactory
public static javax.net.ssl.SSLServerSocketFactory makeSSLSocketFactory(java.security.KeyStore loadedKeyStore, javax.net.ssl.KeyManagerFactory loadedKeyFactory) throws java.io.IOExceptionCreates an SSLSocketFactory for HTTPS. Pass a loaded KeyStore and a loaded KeyManagerFactory. These objects must properly loaded/initialized by the caller.- Throws:
java.io.IOException
-
makeSSLSocketFactory
public static javax.net.ssl.SSLServerSocketFactory makeSSLSocketFactory(java.lang.String keyAndTrustStoreClasspathPath, char[] passphrase) throws java.io.IOExceptionCreates an SSLSocketFactory for HTTPS. Pass a KeyStore resource with your certificate and passphrase- Throws:
java.io.IOException
-
getMimeTypeForFile
public static java.lang.String getMimeTypeForFile(java.lang.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(java.lang.Object closeable)
-
closeAllConnections
public void closeAllConnections()
Forcibly closes all connections that are open.
-
createClientHandler
protected NanoHTTPD.ClientHandler createClientHandler(java.net.Socket finalAccept, java.io.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 toinputStream- 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 java.util.Map<java.lang.String,java.util.List<java.lang.String>> decodeParameters(java.util.Map<java.lang.String,java.lang.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 theserve()method.- Returns:
- a map of
String(parameter name) toList<String>(a list of the values supplied).
-
decodeParameters
protected static java.util.Map<java.lang.String,java.util.List<java.lang.String>> decodeParameters(java.lang.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) toList<String>(a list of the values supplied).
-
decodePercent
protected static java.lang.String decodePercent(java.lang.String str)
Decode percent encodedStringvalues.- Parameters:
str- the percent encodedString- 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 java.lang.String getHostname()
-
getTempFileManagerFactory
public NanoHTTPD.TempFileManagerFactory getTempFileManagerFactory()
-
makeSecure
public void makeSecure(javax.net.ssl.SSLServerSocketFactory sslServerSocketFactory, java.lang.String[] sslProtocols)Call before start() to serve over HTTPS instead of HTTP
-
newChunkedResponse
public static NanoHTTPD.Response newChunkedResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.io.InputStream data)
Create a response with unknown length (using HTTP 1.1 chunking).
-
newFixedLengthResponse
public static NanoHTTPD.Response newFixedLengthResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.io.InputStream data, long totalBytes)
Create a response with known length.
-
newFixedLengthResponse
public static NanoHTTPD.Response newFixedLengthResponse(NanoHTTPD.Response.IStatus status, java.lang.String mimeType, java.lang.String txt)
Create a text response with known length.
-
newFixedLengthResponse
public static NanoHTTPD.Response newFixedLengthResponse(java.lang.String msg)
Create a text response with known length.
-
serve
public NanoHTTPD.Response serve(NanoHTTPD.IHTTPSession session)
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(java.lang.String uri, NanoHTTPD.Method method, java.util.Map<java.lang.String,java.lang.String> headers, java.util.Map<java.lang.String,java.lang.String> parms, java.util.Map<java.lang.String,java.lang.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.parms- Parsed, percent decoded parameters from URI and, in case of POST, data.headers- Header entries, percent decoded- 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 java.io.IOExceptionStart the server.- Throws:
java.io.IOException- if the socket is in use.
-
start
public void start(int timeout) throws java.io.IOExceptionStarts the server (in setDaemon(true) mode).- Throws:
java.io.IOException
-
start
public void start(int timeout, boolean daemon) throws java.io.IOExceptionStart the server.- Parameters:
timeout- timeout to use for socket connections.daemon- start the thread daemon or not.- Throws:
java.io.IOException- if the socket is in use.
-
stop
public void stop()
Stop the server.
-
wasStarted
public final boolean wasStarted()
-
-