This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/master by this push:
new ca4bf1f Add readme to http
ca4bf1f is described below
commit ca4bf1f1cdb74a983b65a572f1aebc3b71623a1a
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Tue Mar 3 23:34:05 2020 +0100
Add readme to http
---
http/README.md | 486 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 486 insertions(+)
diff --git a/http/README.md b/http/README.md
new file mode 100644
index 0000000..b716e1c
--- /dev/null
+++ b/http/README.md
@@ -0,0 +1,486 @@
+# Apache Felix HTTP Service
+
+This is an implementation of the [HTTP Whiteboard Service as described in
chapter
140](https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html)
of the OSGi Compendium (R7) in combination with an implementation of the [HTTP
Service Specification as described in chapter
102](https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.html) of the
OSGi Compendium. The goal is to provide a standard and simplified way to
register servlets, listeners, filters, and resources [...]
+
+ * Standard OSGi Http Service implementation
+ * Standard OSGi Http Whiteboard implementation
+ * Run either with Jetty or inside your own application server using the
servlet bridge
+ * Correctly versioned Servlet API.
+
+## Installing
+
+The Apache Felix HTTP Service project includes several bundles.
+
+ * `org.apache.felix.http.servlet-api` - Provides the Servlet API (versions
2.6, 3.0, and 3.1 of the Servlet specification)
+ * `org.apache.felix.http.api` - Provides the OSGi APIs for the Http
Whiteboard and Http Service.
+ * `org.apache.felix.http.jetty` - Implementation that is embedding Jetty
server (currently Jetty 9, requiring Java 8). This bundle includes the http.api
bundle.
+ * `org.apache.felix.http.sslfilter` - Servlet filter for handling SSL
termination.
+ * `org.apache.felix.http.bridge` - Implementation that uses the host
application server (bridged mode). Must be used with the proxy (see below)
+ * `org.apache.felix.http.cometd` - Adds Comet/Ajax Push functionality to the
HTTP Service implementation.
+ * `org.apache.felix.http.proxy` - Proxy that is needed inside WAR when
deployed inside an application server.
+
+Note that as of version **3.x**, the Serlvet APIs are **no longer** packaged
with the implementation bundles! If you are migrating from lower versions, be
sure to add the
+`org.apache.felix.http.servlet-api` (or any other compatible Serlvet API
bundle) to your
+classpath and deployment!
+
+## Using the OSGi Http Whiteboard
+
+The OSGi whiteboard implementation simplifies the task of registering
servlets, filters, resources, listeners, and servlet contexts. For a complete
introduction, please refer to the OSGi R7 Compendium or Enterprise
specification.
+
+For a short introduction: Such a whiteboard service can be registered by
exporting it as a service, making it no longer necessary to track and use the
`HttpService` directly. The
+whiteboard implementation detects all `javax.servlet.Servlet` and
`javax.servlet.Filter` services with the right service properties. Let us
illustrate the usage by registering a servlet:
+
+```java
+public class Activator implements BundleActivator {
+ private ServiceRegistration registration;
+
+ public void start(BundleContext context) throws Exception {
+ Hashtable props = new Hashtable();
+ props.put("osgi.http.whiteboard.servlet.pattern", "/hello");
+ props.put("servlet.init.message", "Hello World!");
+
+ this.registration = context.registerService(Servlet.class.getName(),
new HelloWorldServlet(), props);
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ this.registration.unregister();
+ }
+}
+```
+
+To ensure the HTTP whiteboard service picks up your servlet and filter
correctly, your service
+registration *must* provide several service properties.
+
+
+### Servlet service properties
+
+ * `osgi.http.whiteboard.servlet.pattern` - defines the servlet pattern to
register the servlet under, should be a path as defined in the Servlet
specification.
+ * `osgi.http.whiteboard.context.select` - Filter expression to select the
servlet context (optional).
+ * `servlet.init.*` - these properties (sans the `servlet.init.` prefix) are
made available throught the `ServletConfig` object of your servlet. This allows
you to supply your servlet initialization parameters as you would normally do
in the web descriptor (web.xml).
+
+### Filter service properties
+
+ * `osgi.http.whiteboard.filter.regex` - The regular expression pattern to
register filter with.
+ * `osgi.http.whiteboard.context.select` - Filter expression to select the
servlet context (optional).
+ * `service.ranking` - an integer value that allows you to specify where in
the filter chain the filter should be registered. Higher rankings will be
placed first in the chain, that is, filter chains are sorted in descending
order. If omitted, a ranking of zero (0) is used.
+ * `filter.init.*` - these properties (sans the `filter.init.` prefix) are
made available throught the `FilterConfig` object of your filter. This allows
you to supply your filter initialization parameters as you would normally do in
the web descriptor (web.xml).
+
+### ServletContextHelper service properties
+
+ * `osgi.http.whiteboard.context.name` - the identifier of the registered
HTTP context to be referenced by a servlet or filter service
+ * `osgi.http.whiteboard.context.path` - The path of the servlet context.
+
+## Using the HttpService
+
+In general the Http Service is regarded legacy and the OSGi Http Whiteboard
should be used instead. If you still want to use the Http Service, this is a
brief introduction. The main components provided by the Apache Felix HTTP
Service bundle are:
+
+ * `HttpService` - Service used to dynamically register resources and servlets;
+ * `HttpContext` - Additional (optional) component to handle authentication,
resource and mime type mappings.
+
+Servlets created for the OSGi HTTP service don't need to have any reference to
the OSGi specification (they only need to
+conform to the Servlet specification), like in the example:
+
+```java
+public class HelloWorld extends HttpServlet {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
+ resp.getWriter().write("Hello World");
+ }
+}
+```
+
+To register a servlet and map it to a URI, you need to retrieve the
`HttpService` and call its `registerServlet` method.
+For this example, a `ServiceTracker` is used to ensure that the registration
occurs when a `HttpService` actually is
+available, and a deregistration occurs when the `HttpService` becomes
unavailable. Alternatively, you can use more
+high-level dependency management libraries, like [Declarative
Services](https://github.com/apache/felix-dev/tree/master/scr), [Felix
Dependency
Manager](https://felix.apache.org/documentation/subprojects/apache-felix-dependency-manager.html),
or Felix HTTP
+whiteboard service (see below).
+
+```java
+public class Activator implements BundleActivator {
+ private ServiceTracker httpTracker;
+
+ public void start(BundleContext context) throws Exception {
+ httpTracker = new ServiceTracker(context, HttpService.class.getName(),
null) {
+ public void removedService(ServiceReference reference, Object
service) {
+ // HTTP service is no longer available, unregister our servlet...
+ try {
+ ((HttpService) service).unregister("/hello");
+ } catch (IllegalArgumentException exception) {
+ // Ignore; servlet registration probably failed earlier on...
+ }
+ }
+
+ public Object addingService(ServiceReference reference) {
+ // HTTP service is available, register our servlet...
+ HttpService httpService = (HttpService)
this.context.getService(reference);
+ try {
+ httpService.registerServlet("/hello", new HelloWorld(), null,
null);
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ return httpService;
+ }
+ };
+ // start tracking all HTTP services...
+ httpTracker.open();
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ // stop tracking all HTTP services...
+ httpTracker.close();
+ }
+}
+```
+
+In the same way, you can unregister a servlet (for instance, in the
`removedMethod` method in the former example) by
+calling the `HttpService.unregister` method.
+
+As you notice in the example above, the `registerServlet` method accepts four
parameters:
+
+ * the servlet alias;
+ * the `Servlet` instance;
+ * an additional configuration `Dictionary`;
+ * a `HttpContext`.
+
+The servlet alias must begin with a slash and must not end with a slash. When
a request is processed, the HTTP Service
+will try to exact match the requested URI with a registered servlet. If not
existent, it will remove the last '/' in the
+URI and everything that follows, and try to match the remaining part, and so
on.
+
+An additional configuration Map can be optionally specified; if present, all
the parameters contained will be copied in
+the ServletContext object.
+
+Finally, an HttpContext object can be optionally specified to handle
authentication, mime type and resource mapping. The
+`HttpContext` interface is quite simple:
+
+```java
+public interface HttpContext {
+ /** Returns the mime type of the specified resource */
+ String getMimeType(java.lang.String name);
+
+ /** Returns the URL to retrieve the specified resource */
+ URL getResource(java.lang.String name);
+
+ /** Manages security for the specified request */
+ boolean handleSecurity(HttpServletRequest request, HttpServletResponse
response);
+}
+```
+
+The use of a custom `HttpContext` is typical when you want to serve static
contents with the HTTP Service. Let's first
+see an example of resource registration **without** `HttpContext`:
+
+```java
+public class Activator implements BundleActivator {
+ private ServiceTracker httpTracker;
+
+ public void start(BundleContext context) throws Exception {
+ httpTracker = new ServiceTracker(context, HttpService.class.getName(),
null) {
+ public void removedService(ServiceReference reference, Object
service) {
+ // HTTP service is no longer available, unregister our resources...
+ try {
+ ((HttpService) service).unregister("/static");
+ } catch (IllegalArgumentException exception) {
+ // Ignore; servlet registration probably failed earlier on...
+ }
+ }
+
+ public Object addingService(ServiceReference reference) {
+ // HTTP service is available, register our resources...
+ HttpService httpService = (HttpService)
this.context.getService(reference);
+ try {
+ httpService.registerResources("/static", "/etc/www", null);
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ return httpService;
+ }
+ };
+ // start tracking all HTTP services...
+ httpTracker.open();
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ // stop tracking all HTTP services...
+ httpTracker.close();
+ }
+}
+```
+
+As a result of the `httpService.registerResources("/static", "/etc/www",
null)` code, all the files available under
+`/etc/www` will be exposed under `/static` (e.g.
`http://localhost:8080/static/001.jpg` will render the
+`/etc/www/001.jpg`). However, the example above can be simplistic in practice;
the `HttpContext` object is the solution
+to customize the resource handling.
+
+For instance, you can set the define more complex URI to file mappings
overriding the `HttpContext.getResource` method,
+or the correct MIME type implementing the method `HttpContext.getMimeType`
like in the example:
+
+```java
+//....
+public String getMimeType(String file) {
+ if (file.endsWith(".jpg") {
+ return "image/jpeg";
+ } else if (file.endsWith(".png")) {
+ return "image/png";
+ } else {
+ return "text/html";
+ }
+}
+//....
+```
+
+If you implement a customised `HttpContext` object, don't forget to specify it
as third parameter of the `registerResources` method invocation:
+
+```java
+// ....
+public Object addingService(ServiceReference reference) {
+ // HTTP service is available, register our resources...
+ HttpService httpService = (HttpService) this.context.getService(reference);
+ try {
+ // explicitly use our own context as 3rd parameter...
+ httpService.registerResources("/static", "/etc/www", new
MyHttpContext());
+ } catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ return httpService;
+}
+// ....
+```
+
+## Using the Servlet Bridge
+
+The servlet bridge is used if you want to use the HTTP service inside a WAR
deployed on a 3rd part applicaiton server. A
+little setup is needed for this to work:
+
+ 1. deploy `org.apache.felix.http.proxy` jar file inside the web application
(`WEB-INF/lib`);
+ 2. in a startup listener (like `ServletContextListener`) set the
BundleContext as a servlet context attribute (see
[example](https://github.com/apache/felix-dev/blob/master/http/samples/bridge/src/main/java/org/apache/felix/http/samples/bridge/StartupListener.java);
+ 3. define `org.apache.felix.http.proxy.ProxyServlet` inside your `web.xml`
and register it to serve on all requests `/*` (see
[example](https://github.com/apache/felix-dev/blob/master/http/samples/bridge/src/main/webapp/WEB-INF/web.xml);
+ 4. define `org.apache.felix.http.proxy.ProxyListener` as a `<listener>` in
your `web.xml` to allow HTTP session related events to be forwarded (see the
section of Servlet API Event forwarding below and
[example](https://github.com/apache/felix-dev/blob/master/http/samples/bridge/src/main/webapp/WEB-INF/web.xml);
+ 5. be sure to add `javax.servlet;javax.servlet.http;version=2.6` to OSGi
system packages (`org.osgi.framework.system.packages`);
+ 6. deploy `org.apache.felix.http.bridge` (or `org.apache.felix.http.bundle`)
inside the OSGi framework.
+
+A detailed example can be found
[here](https://github.com/apache/felix-dev/blob/master/http/samples/bridge).
+
+
+## Using the SSL filter
+
+This filter provides you means to transparently handle [SSL termination
proxies](https://en.wikipedia.org/wiki/SSL_termination_proxy),
+allowing your servlets and filters to work *like they were accessed directly
through HTTPS*. This filter is useful when
+deploying applications in large datacenters where frontend load-balancers
distribute the load among several servers in
+the same datacenter by stripping the SSL encryption.
+
+The SSL filter can be [configured](#ssl-filter-configuration-properties) to
let it detect whether the request was originating from
+an SSL connection. There are several non-standard request headers in use:
+
+| Header name | Used value | Description |
+|--|--|--|
+| `X-Forwarded-Proto` | `https` | used by [Amazon
ELBs](https://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-proto)
and [Nginx](https://wiki.nginx.org/SSL-Offloader) and more or less the
de-facto standard to indicate a SSL-terminated connection. |
+| `X-Forwarded-Protocol` | `https` | alternative to `X-Forwarded-Proto`. |
+| `X-Forwarded-SSL` | `on` | non-standard way used by [some
applications](https://wiki.apache.org/couchdb/Nginx_As_a_Reverse_Proxy). |
+| `Front-End-Https` | `on` | used by
[Microsoft](https://technet.microsoft.com/en-us/library/aa997519%28v=exchg.65%29.aspx)
to indicate a SSL-terminated connection. |
+
+In case a client connected using a certificate, this certificate can be
forwarded as well by the SSL filter. Several
+non-standard request headers are used for this:
+
+| Header | Description |
+|--|--|
+| `X-Forwarded-SSL-Certificate` | The de-facto(?) standard used to forward the
client certificate by a proxy. |
+| `X-Forwarded-SSL-Client-Cert` | Alternative header used by some proxies. |
+
+**Note**: instead of deploying the SSL filter bundle, you can also set the
`org.apache.felix.proxy.load.balancer.connection.enable` property to `true` in
order to achieve the same effect.
+
+## Configuration Properties
+
+The service can both be configured using OSGi environment properties and using
Configuration Admin. The service PID for
+this service is `"org.apache.felix.http"`. If you use both methods,
Configuration Admin takes precedence. The following
+properties can be used (some legacy property names still exist but are not
documented here on purpose):
+
+| Property | Description |
+|--|--|
+| `org.apache.felix.http.debug` | Flag to enable debugging for this service
implementation. The default is `false`. |
+| `org.apache.felix.http.host` | Host name or IP Address of the interface to
listen on. The default is `null` causing Jetty to listen on all interfaces. |
+| `org.osgi.service.http.port` | The port used for servlets and resources
available via HTTP. The default is `8080`. See [port settings
below](#http-port-settings) for additional information. A negative port number
has the same effect as setting `org.apache.felix.http.enable` to `false`. |
+| `org.osgi.service.http.port.secure` | The port used for servlets and
resources available via HTTPS. The default is `8443`. See [port settings
below](#http-port-settings) for additional information. A negative port number
has the same effect as setting `org.apache.felix.https.enable` to `false`. |
+| `org.apache.felix.http.context_path` | The servlet Context Path to use for
the Http Service. If this property is not configured it defaults to "/". This
must be a valid path starting with a slash and not ending with a slash (unless
it is the root context). |
+| `org.apache.felix.http.timeout` | Connection timeout in milliseconds. The
default is `60000` (60 seconds). |
+| `org.apache.felix.http.session.timeout` | Allows for the specification of
the Session life time as a number of minutes. This property serves the same
purpose as the `session-timeout` element in a Web Application descriptor. The
default is "0" (zero) for no timeout at all. |
+| `org.apache.felix.http.nio` | Flag to enable the use of NIO instead of
traditional IO for HTTP. One consequence of using NIO with HTTP is that the
bundle needs at least a Java 5 runtime. The default is `true`. |
+| `org.apache.felix.https.nio` | Flag to enable the use of NIO instead of
traditional IO for HTTPS. One consequence of using NIO with HTTPS is that the
bundle needs at least a Java 5 runtime. If this property is not set the
(default) value of the `org.apache.felix.http.nio` property is used. |
+| `org.apache.felix.http.enable` | Flag to enable the use of HTTP. The default
is `true`. |
+| `org.apache.felix.https.enable` | Flag to enable the user of HTTPS. The
default is `false`. |
+| `org.apache.felix.https.keystore` | The name of the file containing the
keystore. |
+| `org.apache.felix.https.keystore.password` | The password for the keystore. |
+| `org.apache.felix.https.keystore.key.password` | The password for the key in
the keystore. |
+| `org.apache.felix.https.truststore` | The name of the file containing the
truststore. |
+| `org.apache.felix.https.truststore.type` | The type of truststore to use.
The default is `JKS`. |
+| `org.apache.felix.https.truststore.password` | The password for the
truststore. |
+| `org.apache.felix.https.jetty.ciphersuites.excluded` | Configures
comma-separated list of SSL cipher suites to *exclude*. Default is `null`,
meaning that no cipher suite is excluded. |
+| `org.apache.felix.https.jetty.ciphersuites.included` | Configures
comma-separated list of SSL cipher suites to *include*. Default is `null`,
meaning that the default cipher suites are used. |
+| `org.apache.felix.https.jetty.protocols.excluded` | Configures
comma-separated list of SSL protocols (e.g. SSLv3, TLSv1.0, TLSv1.1, TLSv1.2)
to *exclude*. Default is `null`, meaning that no protocol is excluded. |
+| `org.apache.felix.https.jetty.protocols.included` | Configures
comma-separated list of SSL protocols to *include*. Default is `null`, meaning
that the default protocols are used. |
+| `org.apache.felix.https.clientcertificate` | Flag to determine if the HTTPS
protocol requires, wants or does not use client certificates. Legal values are
`needs`, `wants` and `none`. The default is `none`. |
+| `org.apache.felix.http.jetty.headerBufferSize` | Size of the buffer for
request and response headers, in bytes. Default is 16 KB. |
+| `org.apache.felix.http.jetty.requestBufferSize` | Size of the buffer for
requests not fitting the header buffer, in bytes. Default is 8 KB. |
+| `org.apache.felix.http.jetty.responseBufferSize` | Size of the buffer for
responses, in bytes. Default is 24 KB. |
+| `org.apache.felix.http.jetty.maxFormSize` | The maximum size accepted for a
form post, in bytes. Defaults to 200 KB. |
+| `org.apache.felix.http.mbeans` | If `true`, enables the MBean server
functionality. The default is `false`. |
+| `org.apache.felix.http.jetty.sendServerHeader` | If `false`, the `Server`
HTTP header is no longer included in responses. The default is `false`. |
+| `org.eclipse.jetty.servlet.SessionCookie` | Name of the cookie used to
transport the Session ID. The default is `JSESSIONID`. |
+| `org.eclipse.jetty.servlet.SessionURL` | Name of the request parameter to
transport the Session ID. The default is `jsessionid`. |
+| `org.eclipse.jetty.servlet.SessionDomain` | Domain to set on the session
cookie. The default is `null`. |
+| `org.eclipse.jetty.servlet.SessionPath` | The path to set on the session
cookie. The default is the configured session context path ("/"). |
+| `org.eclipse.jetty.servlet.MaxAge` | The maximum age value to set on the
cookie. The default is "-1". |
+| `org.apache.felix.proxy.load.balancer.connection.enable` | Set this to
`true` when running Felix HTTP behind a (offloading) proxy or load balancer
which rewrites the requests. The default is `false`. |
+| `org.apache.felix.http.runtime.init.` | Properties starting with this prefix
are added as service registration properties to the HttpServiceRuntime service.
The prefix is removed for the property name. |
+| `org.apache.felix.jetty.gziphandler.enable` | Whether the server should use
a server-wide gzip handler. Default is false. |
+| `org.apache.felix.jetty.gzip.minGzipSize` | The minimum response size to
trigger dynamic compression. Default is GzipHandler.DEFAULT_MIN_GZIP_SIZE. |
+| `org.apache.felix.jetty.gzip.compressionLevel` | The compression level to
use. Default is Deflater.DEFAULT_COMPRESSION. |
+| `org.apache.felix.jetty.gzip.inflateBufferSize` | The size in bytes of the
buffer to inflate compressed request, or <= 0 for no inflation. Default is -1. |
+| `org.apache.felix.jetty.gzip.syncFlush` | True if Deflater#SYNC_FLUSH should
be used, else Deflater#NO_FLUSH will be used. Default is false. |
+| `org.apache.felix.jetty.gzip.excludedUserAgents` | The regular expressions
matching additional user agents to exclude. Default is none. |
+| `org.apache.felix.jetty.gzip.includedMethods` | The additional http methods
to include in compression. Default is none. |
+| `org.apache.felix.jetty.gzip.excludedMethods` | The additional http methods
to exclude in compression. Default is none. |
+| `org.apache.felix.jetty.gzip.includedPaths` | The additional path specs to
include. Inclusion takes precedence over exclusion. Default is none. |
+| `org.apache.felix.jetty.gzip.excludedPaths` | The additional path specs to
exclude. Inclusion takes precedence over exclusion. Default is none. |
+| `org.apache.felix.jetty.gzip.includedMimeTypes` | The included mime types.
Inclusion takes precedence over exclusion. Default is none. |
+| `org.apache.felix.jetty.gzip.excludedMimeTypes` | The excluded mime types.
Inclusion takes precedence over exclusion. Default is none. |
+
+### All-in-one-bundle configuration properties
+
+Additionally, the all-in-one bundle uses the following environment properties
(no support for Configuration Admin):
+
+| Property | Description |
+|--|--|
+| `org.apache.felix.http.jettyEnabled` | If `true`, the embedded Jetty server
is used as HTTP container. The default is `false`. |
+| `org.apache.felix.http.whiteboardEnabled` | If `true`, the whiteboard-style
registration of servlets and filters is enabled. The default is `false`. |
+| `org.apache.felix.http.cometdEnabled` | If `true` the CometD/Ajax Push
feature is enabled. The default is `false`. |
+
+### Multiple Servers
+
+It is possible to configure several Http Services, each running on a different
port. The first service can be configured as outlined above using the service
PID for `"org.apache.felix.http"`. Additional servers can be configured through
OSGi factory configurations using `"org.apache.felix.http"` as the factory PID.
The properties for the configuration are outlined as above.
+
+The default server using the PID `"org.apache.felix.http"` can be disabled by
specifying a negative port and then all servers can be used through factory
configurations.
+
+
+### CometD configuration properties
+
+The CometD bundle supports the following configuration options, using the PID
`org.apache.felix.http.cometd` or through
+environment properties:
+
+| Property | Description |
+|--|--|
+| `org.apache.felix.http.cometd.path` | Defines the path for the CometD
endpoint. Default is `/system/cometd`. |
+
+### SSL filter configuration properties
+
+The SSL-filter bundle supports the following configuration options, using the
PID
+`org.apache.felix.http.sslfilter.SslFilter` (no fallback to environment
properties!):
+
+| Property | Description |
+|--|--|
+| `ssl-forward.header` | Defines what HTTP header to look for in a request to
determine whether a request is a forwarded SSL request. The default is
`X-Forwarded-SSL`. |
+| `ssl-forward.value` | Defines what HTTP header value to look for in a
request to determine whether a request is a forwarded SSL request in a request.
The default is `on`. |
+| `ssl-forward-cert.header` | Defines what HTTP header to look for in a
request to obtain the forwarded client certificate. The default is
`X-Forwarded-SSL-Certificate`. |
+
+
+### HTTP port settings
+
+As of HTTP Jetty version 2.2.2, it is possible to assign a free port for HTTP
or HTTPS automatically, based on certain
+rules, for example, a range between 8000 and 9000. The syntax is based on the
version ranges, as described in the OSGi
+specification. The following forms are supported:
+
+ * `*` or `0`: binds to the first available port;
+ * `8000`: binds to port `8000`, failing if this port is already taken;
+ * `[8000,9000]`: binds to a free port in the range 8000 (inclusive) and 9000
(inclusive);
+ * `[8000,9000)`: binds to a free port in the range 8000 (inclusive) and 9000
(exclusive);
+ * `(8000,9000]`: binds to a free port in the range 8000 (exclusive) and 9000
(inclusive);
+ * `(8000,9000)`: binds to a free port in the range 8000 (exclusive) and 9000
(exclusive);
+ * `[,9000)`: binds to a free port in the range 1 (inclusive) and 9000
(exclusive);
+ * `[8000,)`: binds to a free port in the range 8000 (inclusive) and 65535
(exclusive).
+
+Note that picking a port is *not* performed atomically and multiple instances
can try to bind to the same port at the
+same time.
+
+## Servlet API Events
+
+The Servlet API defines a number of `EventListener` interfaces to catch
servlet or filter related events. As of HTTP
+Service 2.1.0 most events generated by the servlet container are forwarded to
interested service. To be registered to
+receive events services must be registered with the respective `EventListener`
interface:
+
+| Interface | Description |
+|--|--|
+| `javax.servlet.ServletContextAttributeListener` | Events on servlet context
attribute addition, change and removal. |
+| `javax.servlet.ServletRequestAttributeListener` | Events on request
attribute addition, change and removal. |
+| `javax.servlet.ServletRequestListener` | Events on request start and end. |
+| `javax.servlet.http.HttpSessionAttributeListener` | Events on session
attribute addition, change and removal. To receive such events in a bridged
environment, the `ProxyLister` must be registered with the servlet container.
See the *Using the Servlet Bridge* section above. |
+| `javax.servlet.http.HttpSessionListener` | Events on session creation and
destroyal. To receive such events in a bridged environment, the `ProxyLister`
must be registered with the servlet container. See the *Using the Servlet
Bridge* section above. |
+
+Of the defined `EventListener` interfaces in the Servlet API, the
`javax.servlet.ServletContextListener` events are
+currently not support (but will be in the near future). For one thing they do
not make much sense in an OSGi
+environment. On the other hand they are hard to capture and propagate. For
example in a bridged environment the
+`contextInitialized` event may be sent before the framework and any of the
contained bundles are actually ready to act.
+Likewise the `contextDestroyed` event may come to late.
+
+
+## Servlet Context Notes
+
+`ServletContext` instances are managed internally by the Http Service
implementation. For each `HttpContext` instance
+used to register one or more servlets and/or resources a corresponding
`ServletContext` instance is created. These
+`ServletContext` instances is partly based on the single `ServletContext`
instance received from the Servlet Container
+--- either embedded Jetty or some external Servlet Container when using the
Http Service Bridge --- and partly based on
+the provided `HttpContext` instance:
+
+| Method(s) | Based on ... |
+|-|-|
+| `getContextPath`, `getContext`, `getMajorVersion`, `getMinorVersion`,
`getServerInfo` | Servlet Containers `ServletContext` |
+| `getResourcePaths` | `Bundle.getEntryPaths` of the bundle using the Http
Service |
+| `getResource`, `getResourceAsStream` | `HttpContext.getResource` |
+| `getMimeType` | `HttpContext.getMimeType` |
+| `getRequestDispatcher`, `getNamedDispatcher`, `getInitParameter`,
`getServlet`, `getRealPath` | Always return `null` |
+| `getInitParameterNames`, `getServlets`, `getServletNames` | Always returns
empty `Enumeration` |
+| `getAttribute`, `getAttributeNames`, `setAttribute`, `removeAttribute` | By
default maintained for each `ServletContext` managed by the Http Service. If
the `org.apache.felix.http.shared*servlet*context_attributes` framework
property is set to `true` these methods are actually based on the
`ServletContext` provided by the servlet container and thus attributes are
shared amongst all `ServlectContext` instances, incl. the `ServletContext`
provided by the servlet container |
+
+
+## Examples
+
+A set of simple examples illustrating the various features are available.
+
+ * Whiteboard sample:
<https://github.com/apache/felix-dev/tree/master/http/samples/whiteboard>
+ * Servlet bridge sample:
<https://github.com/apache/felix-dev/tree/master/http/samples/bridge/>
+ * CometD sample:
<https://github.com/apache/felix-dev/tree/master/http/samples/cometd/>
+
+
+## Maven Artifacts
+
+This is a list of the most recent artifacts at the time of writing this
document. There might already be never versions available:
+
+```xml
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.servlet-api</artifactId>
+ <version>1.1.2</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.jetty</artifactId>
+ <version>4.0.14</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.bridge</artifactId>
+ <version>4.0.8</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.cometd</artifactId>
+ <version>2.3.2</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.proxy</artifactId>
+ <version>3.0.6</version>
+</dependency>
+<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.http.sslfilter</artifactId>
+ <version>1.2.6</version>
+</dependency>
+```