blob: b3ce0d732a0e51c999acc6d6919e59d0a1541a3c [file] [log] [blame]
/* Copyright (c) 2001-2010, 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.BundleHandler;
// fredt@users 20020215 - patch 1.7.0 by fredt
// method rorganised to use new HsqlServerProperties class
// unsaved@users 20021113 - patch 1.7.2 - SSL support
// boucherb@users 20030510 - patch 1.7.2 - SSL support moved to factory interface
// boucherb@users 20030510 - patch 1.7.2 - moved all common code to Server
// boucherb@users 20030510 - patch 1.7.2 - general lint removal
/**
* 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
* retreive 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: <p>
* <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 => 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 Boucher-Burnett (boucherb@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.
*/
static int webBundleHandle = BundleHandler.getBundleHandle("webserver",
null);
public WebServer() {
super(ServerConstants.SC_PROTOCOL_HTTP);
}
/**
* 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) {
String propsPath =
FileUtil.getFileUtil().canonicalOrAbsolutePath("webserver");
ServerProperties fileProps = ServerConfiguration.getPropertiesFromFile(
ServerConstants.SC_PROTOCOL_HTTP, propsPath);
ServerProperties props =
fileProps == null
? new ServerProperties(ServerConstants.SC_PROTOCOL_HTTP)
: fileProps;
HsqlProperties stringProps = null;
stringProps = HsqlProperties.argArrayToProps(args,
ServerConstants.SC_KEY_PREFIX);
if (stringProps.getErrorKeys().length != 0) {
printHelp("webserver.help");
return;
}
props.addProperties(stringProps);
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);
// finished setting up properties;
Server server = new WebServer();
try {
server.setProperties(props);
props.validate();
// This must be called after setProperties, because stringProps
// isn't populated until then.
} 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).
*
* @return the name of the web page served when no page is specified
*
* @jmx.managed-attribute
* access="read-write"
* description="Used when server protocol is HTTP(S)"
*/
public String getDefaultWebPage() {
return serverProperties.getProperty(
ServerConstants.SC_KEY_WEB_DEFAULT_PAGE);
}
/**
* 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 BundleHandler.getString(serverBundleHandle, "webserver.help");
}
/**
* Retrieves this server's product name. <p>
*
* Typically, this will be something like: "HSQLDB xxx server".
*
* @return the product name of this server
*
* @jmx.managed-attribute
* access="read-only"
* description="Of Server"
*/
public String getProductName() {
return "HSQLDB web server";
}
/**
* Retrieves a string respresentaion of the network protocol
* this server offers, typically one of 'HTTP', HTTPS', 'HSQL' or 'HSQLS'.
*
* @return string respresentation of this server's protocol
*
* @jmx.managed-attribute
* access="read-only"
* description="Used to handle connections"
*/
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.
*
* @return the root context (directory) from which web content is served
*
* @jmx.managed-attribute
* access="read-write"
* description="Context (directory)"
*/
public String getWebRoot() {
return serverProperties.getProperty(ServerConstants.SC_KEY_WEB_ROOT);
}
}