/* Copyright (c) 2001-2019, The HSQL Development Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the HSQL Development Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


package org.hsqldb.server;

import org.hsqldb.lib.FileUtil;
import org.hsqldb.persist.HsqlProperties;
import org.hsqldb.resources.ResourceBundleHandler;

// fredt@users 20020215 - patch 1.7.0 by fredt
// method re-organised to use new HsqlServerProperties class
// unsaved@users 20021113 - patch 1.7.2 - SSL support
// campbell-burnet@users 20030510 - patch 1.7.2 - SSL support moved to factory interface
// campbell-burnet@users 20030510 - patch 1.7.2 - moved all common code to Server
// campbell-burnet@users 20030510 - patch 1.7.2 - general lint removal

The HSQLDB HTTP protocol network database server.

WebServer has two distinct functions:

The primary function is to allow client/server access to HSQLDB databases via the HTTP protocol. This protocol is less efficient than the HSQL protocol used by the Server class and should be used only in situations where sandboxes or firewalls between the client and the server do not allow the use of the HSQL protocol. One example is client/server access by an applet running in browsers on remote hosts and accessing the database engine on the HTTP server from which the applet originated. From version 1.7.2, HTTP database connections are persistent and support transactions. Similar to HSQL connections, they should be explicitly closed to free the server resources.

The secondary function of WebServer is to act as a simple general purpose HTTP server. It is aimed to support the minimum requirements set out by the HTTP/1.0 standard. The HEAD and GET methods can be used to query and retrieve static files from the HTTP server.

Both the database server and HTTP server functions of WebServer can be configured with the webserver.properties file. It contains entries for the database server similar to those for the HSQL protocol Server class. In addition, a list mapping different file endings to their mime types may be included in this file. (fredt@users)

From the command line, the options are as follows:

+-----------------+-------------+----------+------------------------------+
|    OPTION       |    TYPE     | DEFAULT  |         DESCRIPTION          |
+-----------------+-------------+----------+------------------------------|
| --help          |             |          | prints this message          |
| --address       | name|number | any      | server inet address          |
| --port          | number      | 80       | port at which server listens |
| --database.i    | [type]spec  | 0=test   | path of database i           |
| --dbname.i      | alias       |          | url alias for database i     |
| --silent        | true|false  | true     | false => display all queries |
| --trace         | true|false  | false    | display JDBC trace messages  |
| --no_system_exit| true|false  | false    | do not issue System.exit()   |
+-----------------+-------------+----------+------------------------------+
Example of the webserver.properties file:
server.port=80
server.database.0=test
server.dbname.0=...
...
server.database.n=...
server.dbname.n=...
server.silent=true
.htm=text/html
.html=text/html
.txt=text/plain
.gif=image/gif
.class=application/octet-stream
.jpg=image/jpeg
.jgep=image/jpeg
.zip=application/x-zip-compressed
  • For server.root, use '/' as the separator, even for DOS/Windows.
  • File extensions for mime types must be lowercase and start with '.'
Author:Campbell Burnet (campbell-burnet@users dot sourceforge.net), Fred Toussi (fredt@users dot sourceforge.net)
Version:1.7.2
Since:1.7.2
/** * The HSQLDB HTTP protocol network database server. <p> * * WebServer has two distinct functions:<p> * * The primary function is to allow client/server access to HSQLDB databases * via the HTTP protocol. This protocol is less efficient than the HSQL * protocol used by the Server class and should be used only in situations * where sandboxes or firewalls between the client and the server do not * allow the use of the HSQL protocol. One example is client/server access by * an applet running in browsers on remote hosts and accessing the database * engine on the HTTP server from which the applet originated. From version * 1.7.2, HTTP database connections are persistent and support transactions. * Similar to HSQL connections, they should be explicitly closed to free the * server resources. <p> * * The secondary function of WebServer is to act as a simple general purpose * HTTP server. It is aimed to support the minimum requirements set out by * the HTTP/1.0 standard. The HEAD and GET methods can be used to query and * retrieve static files from the HTTP server.<p> * * Both the database server and HTTP server functions of WebServer can be * configured with the webserver.properties file. It contains entries for the * database server similar to those for the HSQL protocol Server class. In * addition, a list mapping different file endings to their mime types may be * included in this file. (fredt@users) <p> * * From the command line, the options are as follows: * <pre> * +-----------------+-------------+----------+------------------------------+ * | OPTION | TYPE | DEFAULT | DESCRIPTION | * +-----------------+-------------+----------+------------------------------| * | --help | | | prints this message | * | --address | name|number | any | server inet address | * | --port | number | 80 | port at which server listens | * | --database.i | [type]spec | 0=test | path of database i | * | --dbname.i | alias | | url alias for database i | * | --silent | true|false | true | false =&gt; display all queries | * | --trace | true|false | false | display JDBC trace messages | * | --no_system_exit| true|false | false | do not issue System.exit() | * +-----------------+-------------+----------+------------------------------+ * </pre> * * Example of the webserver.properties file: * * <pre> * server.port=80 * server.database.0=test * server.dbname.0=... * ... * server.database.n=... * server.dbname.n=... * server.silent=true * * .htm=text/html * .html=text/html * .txt=text/plain * .gif=image/gif * .class=application/octet-stream * .jpg=image/jpeg * .jgep=image/jpeg * .zip=application/x-zip-compressed * </pre> * * <ul> * <li>For server.root, use '/' as the separator, even for DOS/Windows. * <li>File extensions for mime types must be lowercase and start with '.' * </ul> * * @author Campbell Burnet (campbell-burnet@users dot sourceforge.net) * @author Fred Toussi (fredt@users dot sourceforge.net) * @version 1.7.2 * @since 1.7.2 */
public class WebServer extends Server {
Handle to resource bundle providing i18n for things like HTTP error pages.
/** * Handle to resource bundle providing i18n for things like * HTTP error pages. */
static int webBundleHandle = ResourceBundleHandler.getBundleHandle("webserver-pages", null); public WebServer() { super(ServerConstants.SC_PROTOCOL_HTTP); }
Starts a new WebServer.
Params:
  • args – the "command line" parameters with which to start the WebServer. "-?" will cause the command line arguments help to be printed to the standard output
/** * Starts a new WebServer. * * @param args the "command line" parameters with which to start * the WebServer. "-?" will cause the command line arguments * help to be printed to the standard output */
public static void main(String[] args) { HsqlProperties argProps = null; argProps = HsqlProperties.argArrayToProps(args, ServerProperties.sc_key_prefix); String[] errors = argProps.getErrorKeys(); if (errors.length != 0) { System.out.println("no value for argument:" + errors[0]); printHelp("webserver.help"); return; } String propsPath = argProps.getProperty(ServerProperties.sc_key_props); String propsExtension = ""; if (propsPath == null) { propsPath = "webserver"; propsExtension = ".properties"; } propsPath = FileUtil.getFileUtil().canonicalOrAbsolutePath(propsPath); ServerProperties fileProps = ServerConfiguration.getPropertiesFromFile( ServerConstants.SC_PROTOCOL_HTTP, propsPath, propsExtension); ServerProperties props = fileProps == null ? new ServerProperties(ServerConstants.SC_PROTOCOL_HTTP) : fileProps; props.addProperties(argProps); ServerConfiguration.translateDefaultDatabaseProperty(props); // Standard behaviour when started from the command line // is to halt the VM when the server shuts down. This may, of // course, be overridden by whatever, if any, security policy // is in place. ServerConfiguration.translateDefaultNoSystemExitProperty(props); ServerConfiguration.translateAddressProperty(props); // finished setting up properties; Server server = new WebServer(); try { server.setProperties(props); } catch (Exception e) { server.printError("Failed to set properties"); server.printStackTrace(e); return; } // now messages go to the channel specified in properties server.print("Startup sequence initiated from main() method"); if (fileProps != null) { server.print("Loaded properties from [" + propsPath + ".properties]"); } else { server.print("Could not load properties from file"); server.print("Using cli/default properties only"); } server.start(); }
Retrieves the name of the web page served when no page is specified. This attribute is relevant only when server protocol is HTTP(S).
Returns:the name of the web page served when no page is specified
/** * Retrieves the name of the web page served when no page is specified. * This attribute is relevant only when server protocol is HTTP(S). * * @return the name of the web page served when no page is specified */
public String getDefaultWebPage() { return serverProperties.getProperty( ServerProperties.sc_key_web_default_page); }
Retrieves a String object describing the command line and properties options for this Server.
Returns:the command line and properties options help for this Server
/** * Retrieves a String object describing the command line and * properties options for this Server. * * @return the command line and properties options help for this Server */
public String getHelpString() { return ResourceBundleHandler.getString(serverBundleHandle, "webserver.help"); }
Retrieves this server's product name.

Typically, this will be something like: "HSQLDB xxx server".

Returns:the product name of this server
/** * Retrieves this server's product name. <p> * * Typically, this will be something like: "HSQLDB xxx server". * * @return the product name of this server */
public String getProductName() { return "HSQLDB web server"; }
Retrieves a string representation of the network protocol this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
Returns:string representation of this server's protocol
/** * Retrieves a string representation of the network protocol * this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'. * * @return string representation of this server's protocol */
public String getProtocol() { return isTls() ? "HTTPS" : "HTTP"; }
Retrieves the root context (directory) from which web content is served. This property is relevant only when the server protocol is HTTP(S). Although unlikely, it may be that in the future other contexts, such as jar urls may be supported, so that pages can be served from the contents of a jar or from the JVM class path.
Returns:the root context (directory) from which web content is served
/** * Retrieves the root context (directory) from which web content * is served. This property is relevant only when the server * protocol is HTTP(S). Although unlikely, it may be that in the future * other contexts, such as jar urls may be supported, so that pages can * be served from the contents of a jar or from the JVM class path. * * @return the root context (directory) from which web content is served */
public String getWebRoot() { return serverProperties.getProperty(ServerProperties.sc_key_web_root); } }