/* Copyright (c) 2001-2017, 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. <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 => 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.
*/
static int
webBundleHandle =
ResourceBundleHandler.
getBundleHandle("webserver-pages", 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) {
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).
*
* @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.
*
* @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. <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'.
*
* @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.
*
* @return the root context (directory) from which web content is served
*/
public
String getWebRoot() {
return
serverProperties.
getProperty(
ServerProperties.
sc_key_web_root);
}
}