From 782d0cda46b6db38f1f4f59f65d06e820327390b Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Fri, 8 Feb 2013 10:10:02 +0000
Subject: [PATCH] Updated user manual

---
 UserManual.md | 361 +++++++++++++++++++++++++++++---------------------
 1 file changed, 209 insertions(+), 152 deletions(-)

diff --git a/UserManual.md b/UserManual.md
index f0d435451..39a2c8e03 100644
--- a/UserManual.md
+++ b/UserManual.md
@@ -1,14 +1,15 @@
-
-**NOTE: THIS MANUAL IS WORK IN PROGRESS**
-
-## Overview
+# Overview
 
 Mongoose is small and easy to use web server. It is self-contained, and does
 not require any external software to run.
 
 On Windows, mongoose iconifies itself to the system tray icon when started.
 Right-click on the icon pops up a menu, where it is possible to stop
-mongoose, or configure it, or install it as Windows service.
+mongoose, or configure it, or install it as Windows service. The easiest way
+to share a folder on Windows is to copy `mongoose.exe` to a folder,
+double-click the exe, and launch a browser at
+[http://localhost:8080](http://localhost:8080). Note that 'localhost' should
+be changed to a machine's name if a folder is accessed from other computer.
 
 On UNIX and Mac, mongoose is a command line utility. Running `mongoose` in
 terminal, optionally followed by configuration parameters
@@ -21,12 +22,13 @@ When started, mongoose first searches for the configuration file.
 If configuration file is specified explicitly in the command line, i.e.
 `mongoose path_to_config_file`, then specified configuration file is used.
 Otherwise, mongoose would search for file `mongoose.conf` in the same directory
-where binary is located, and use it.
+where binary is located, and use it. Configuration file can be absent.
+
+
 Configuration file is a sequence of lines, each line containing
 command line argument name and it's value. Empty lines, and lines beginning
 with `#`, are ignored. Here is the example of `mongoose.conf` file:
 
-    # mongoose.conf file
     document_root c:\www
     listening_ports 8080,8043s
     ssl_certificate c:\mongoose\ssl_cert.pem
@@ -38,164 +40,219 @@ For example, if `mongoose.conf` has line
 `document_root /var/www`, and mongoose has been started as
 `mongoose -document_root /etc`, then `/etc` directory will be served as
 document root, because command line options take priority over
-configuration file.
+configuration file. Configuration options section below provide a good
+overview of Mongoose features.
 
 Mongoose can also be used to modify `.htpasswd` passwords file:
 
     mongoose -A <htpasswd_file> <realm> <user> <passwd>
 
-## Usage Examples
-
-- How to share a Windows folder: copy mongoose executable to a folder and
-  double-click the executable. The folder should be accessible via
-  [http://localhost:8080](http://localhost:8080) in any browser.
-
-- How to start mongoose at UNIX startup time in daemon mode, serving
-  directory `/var/www`: put this line in the system startup script:
-  `/path/to/mongoose -listening_ports 80 -document_root /var/www &`
-
-- How to serve user home directories using URL rewrite:
-  `mongoose -url_rewrite_patterns /~joe/=/home/joe/,/~bill=/home/bill/`
-
-## Configuration Options
-```
-     -C cgi_pattern
-         All files that fully match cgi_pattern are treated as CGI.
-         Default pattern allows CGI files be anywhere. To restrict CGIs to
-         certain directory, use e.g. "-C /cgi-bin/**.cgi".  Default:
-         "**.cgi$|**.pl$|**.php$"
-
-     -E cgi_environment
-         Extra environment variables to be passed to the CGI script in
-         addition to standard ones. The list must be comma-separated list
-         of X=Y pairs, like this: "VARIABLE1=VALUE1,VARIABLE2=VALUE2".
-         Default: ""
-
-     -G put_delete_passwords_file
-         PUT and DELETE passwords file. This must be specified if PUT or
-         DELETE methods are used. Default: ""
-
-     -I cgi_interpreter
-         Use cgi_interpreter as a CGI interpreter for all CGI scripts
-         regardless script extension.  Mongoose decides which interpreter
-         to use by looking at the first line of a CGI script.  Default:
-         "".
-
-     -P protect_uri
-         Comma separated list of URI=PATH pairs, specifying that given
-         URIs must be protected with respected password files. Default: ""
-
-     -R authentication_domain
-         Authorization realm. Default: "mydomain.com"
-
-     -S ssi_pattern
-         All files that fully match ssi_pattern are treated as SSI.
-         Unknown SSI directives are silently ignored. Currently, two SSI
-         directives are supported, "include" and "exec".  Default:
-         "**.shtml$|**.shtm$"
-
-     -T throttle
-         Limit download speed for clients.  throttle is a comma-separated
-         list of key=value pairs, where key could be a '*' character
-         (limit for all connections), a subnet in form x.x.x.x/mask (limit
-         for a given subnet, for example 10.0.0.0/8), or an URI prefix
-         pattern (limit for the set of URIs, for example /foo/**). The
-         value is a floating-point number of bytes per second, optionally
-         followed by a `k' or `m' character, meaning kilobytes and
-         megabytes respectively. A limit of 0 means unlimited rate. The
-         last matching rule wins. For example, "*=1k,10.0.0.0/8" means
-         limit everybody to 1 kilobyte per second, but give people from
-         10/8 subnet unlimited speed. Default: ""
-
-     -a access_log_file
-         Access log file. Default: "", no logging is done.
-
-     -d enable_directory_listing
-         Enable/disable directory listing. Default: "yes"
-
-     -e error_log_file
-         Error log file. Default: "", no errors are logged.
-
-     -g global_passwords_file
-         Location of a global passwords file. If set, per-directory
-         .htpasswd files are ignored, and all requests must be authorised
-         against that file.  Default: ""
-
-     -i index_files
-         Comma-separated list of files to be treated as directory index
-         files.  Default: "index.html,index.htm,index.cgi"
-
-     -l access_control_list
-         Specify access control list (ACL). ACL is a comma separated list
-         of IP subnets, each subnet is prepended by '-' or '+' sign. Plus
-         means allow, minus means deny. If subnet mask is omitted, like
-         "-1.2.3.4", then it means single IP address. Mask may vary from 0
-         to 32 inclusive. On each request, full list is traversed, and
-         last match wins. Default setting is to allow all. For example, to
-         allow only 192.168/16 subnet to connect, run "mongoose
-         -0.0.0.0/0,+192.168/16".  Default: ""
-
-     -m extra_mime_types
-         Extra mime types to recognize, in form "extension1=type1,exten-
-         sion2=type2,...". Extension must include dot.  Example: "mongoose
-         -m .cpp=plain/text,.java=plain/text". Default: ""
-
-     -p listening_ports
-         Comma-separated list of ports to listen on. If the port is SSL, a
-         letter 's' must be appeneded, for example, "-p 80,443s" will open
-         port 80 and port 443, and connections on port 443 will be SSL-ed.
-         It is possible to specify an IP address to bind to. In this case,
-         an IP address and a colon must be prepended to the port number.
-         For example, to bind to a loopback interface on port 80 and to
-         all interfaces on HTTPS port 443, use "mongoose -p
-         127.0.0.1:80,443s". Default: "8080"
-
-     -r document_root
-         Location of the WWW root directory. Default: "."
-
-     -s ssl_certificate
-         Location of SSL certificate file. Default: ""
-
-     -t num_threads
-         Number of worker threads to start. Default: "10"
-
-     -u run_as_user
-         Switch to given user's credentials after startup. Default: ""
-
-     -w url_rewrite_patterns
-         Comma-separated list of URL rewrites in the form of "pattern=sub-
-         stitution,..." If the "pattern" matches some prefix of the
-         requested URL, then matched prefix gets substituted with "substi-
-         tution".  For example, "-w /con-
-         fig=/etc,**.doc|**.rtf=/path/to/cgi-bin/handle_doc.cgi" will
-         serve all URLs that start with "/config" from the "/etc" direc-
-         tory, and call handle_doc.cgi script for .doc and .rtf file
-         requests. If some pattern matches, no further matching/substitu-
-         tion is performed (first matching pattern wins). Use full paths
-         in substitutions. Default: ""
-
-     -x hide_files_patterns
-         A prefix pattern for the files to hide. Files that match the pat-
-         tern will not show up in directory listing and return 404 Not
-         Found if requested. Default: ""
-
-```
-
-## Common Problems
----------------
+Unlike other web servers, mongoose does not require CGI scripts be located in
+a special directory. CGI scripts can be anywhere. CGI (and SSI) files are
+recognized by the file name pattern. Mongoose uses shell-like glob
+patterns. Pattern match starts at the beginning of the string, so essentially
+patterns are prefix patterns. Syntax is as follows:
+
+     **      Matches everything
+     *       Matches everything but slash character, '/'
+     ?       Matches any character
+     $       Matches the end of the string
+     |       Matches if pattern on the left side or the right side matches.
+
+All other characters in the pattern match themselves. Examples:
+
+    **.cgi$      Any string that ends with .cgi
+    /foo         Any string that begins with /foo
+    **a$|**b$    Any string that ends with a or b
+
+# Configuration Options
+
+Below is a list of configuration options Mongoose understands. Every option
+is followed by it's default value. If default value is not present, then
+it is empty.
+
+### cgi_pattern `**.cgi$|**.pl$|**.php$`
+All files that match `cgi_pattern` are treated as CGI files. Default pattern
+allows CGI files be anywhere. To restrict CGIs to a certain directory,
+use `/path/to/cgi-bin/**.cgi` as pattern. Note that full file path is
+matched against the pattern, not the URI.
+
+### cgi_environment
+Extra environment variables to be passed to the CGI script in
+addition to standard ones. The list must be comma-separated list
+of name=value pairs, like this: `VARIABLE1=VALUE1,VARIABLE2=VALUE2`.
+
+### put\_delete\_passwords_file
+Passwords file for PUT and DELETE requests. Without it, PUT and DELETE requests
+will fail.
+
+### cgi_interpreter
+Path to an executable to use as CGI interpreter for __all__ CGI scripts
+regardless script extension. If this option is not set (which is a default),
+Mongoose looks at first line of a CGI script,
+[shebang line](http://en.wikipedia.org/wiki/Shebang_(Unix)), for an interpreter.
+
+For example, if both PHP and perl CGIs are used, then
+`#!/path/to/php-cgi.exe` and `#!/path/to/perl.exe` must be first lines of the
+respective CGI scripts. Note that paths should be either full file paths,
+or file paths relative to the current working directory of mongoose server.
+If mongoose is started by mouse double-click on Windows, current working
+directory is a directory where mongoose executable is located.
+
+If all CGIs use the same interpreter, for example they are all PHP, then
+`cgi_interpreter` can be set to the path to `php-cgi.exe` executable and
+shebang line in the CGI scripts can be omitted.
+Note that PHP scripts must use `php-cgi.exe` executable, not `php.exe`.
+
+### protect_uri
+Comma separated list of URI=PATH pairs, specifying that given
+URIs must be protected with respected password files. Paths must be full
+file paths.
+
+### authentication_domain `mydomain.com`
+Authorization realm used in `.htpasswd` authorization.
+
+### ssi_pattern `**.shtml$|**.shtm$`
+All files that match `ssi_pattern` are treated as SSI.
+Unknown SSI directives are silently ignored. Currently, two SSI
+directives are supported, `<!--#include ...>` and
+`<!--#exec command>`. Note that `<!--#include ...>` directive supports
+three path specifications:
+
+    <!--#include virtual="path">  Path is relative to web server root
+    <!--#include file="path">     Path is relative to web server working dir
+    <!--#include "path">          Path is relative to current document
+
+### throttle
+Limit download speed for clients.  `throttle` is a comma-separated
+list of key=value pairs, where key could be:
+
+    *                   limit speed for all connections
+    x.x.x.x/mask        limit speed for specified subnet
+    uri_prefix_pattern  limit speed for given URIs
+
+The value is a floating-point number of bytes per second, optionally
+followed by a `k` or `m` character, meaning kilobytes and
+megabytes respectively. A limit of 0 means unlimited rate. The
+last matching rule wins. Examples:
+
+    *=1k,10.0.0.0/8=0   limit all accesses to 1 kilobyte per second,
+                        but give connections from 10.0.0.0/8 subnet
+                        unlimited speed
+
+    /downloads/=5k      limit accesses to all URIs in `/downloads/` to
+                        5 kilobytes per secods. All other accesses are unlimited
+
+### access\_log\_file
+Path to a file for access logs. Either full path, or relative to current
+working directory. If absent (default), then accesses are not logged.
+
+### error\_log\_file
+Path to a file for error logs. Either full path, or relative to current
+working directory. If absent (default), then errors are not logged.
+
+### enable\_directory\_listing `yes`
+Enable directory listing, either `yes` or `no`.
+
+### global\_passwords\_file
+Path to a global passwords file, either full path or relative to the current
+working directory. If set, per-directory `.htpasswd` files are ignored,
+and all requests are authorised against that file.
+
+### index_files `index.html,index.htm,index.cgi,index.shtml,index.php`
+Comma-separated list of files to be treated as directory index
+files.
+
+### access\_control\_list
+Access Control List (ACL) is a comma separated list
+of IP subnets, each subnet is prepended by `-` or `+` sign. Plus
+means allow, minus means deny. If subnet mask is omitted, like
+`-1.2.3.4`, then it means a single IP address. Mask may vary from 0
+to 32 inclusive. On each request, full list is traversed, and
+last match wins. Default setting is to allow all accesses. Examples:
+
+    -0.0.0.0/0,+192.168/16    deny all acccesses, only allow 192.168/16 subnet
+
+### extra\_mime\_types
+Extra mime types to recognize, in form `extension1=type1,exten-
+sion2=type2,...`. Extension must include dot.  Example:
+`.cpp=plain/text,.java=plain/text`
+
+### listening_ports `8080`
+Comma-separated list of ports to listen on. If the port is SSL, a
+letter `s` must be appeneded, for example, `80,443s` will open
+port 80 and port 443, and connections on port 443 will be SSL-ed.
+For non-SSL ports, it is allowed to append letter `r`, meaning 'redirect'.
+Redirect ports will redirect all their traffic to the first configured
+SSL port. For example, if `listening_ports` is `80r,443s`, then all
+HTTP traffic coming at port 80 will be redirected to HTTPS port 443.
+
+It is possible to specify an IP address to bind to. In this case,
+an IP address and a colon must be prepended to the port number.
+For example, to bind to a loopback interface on port 80 and to
+all interfaces on HTTPS port 443, use `127.0.0.1:80,443s`.
+
+### document_root `.`
+A directory to serve. By default, currect directory is served. Current
+directory is commonly referenced as dot (`.`).
+
+### ssl_certificate
+Path to SSL certificate file. This option is only required when at least one
+of the `listening_ports` is SSL.
+
+### num_threads `50`
+Number of worker threads. Mongoose handles each incoming connection in a
+separate thread. Therefore, the value of this option is effectively a number
+of concurrent HTTP connections Mongoose can handle.
+
+### run\_as\_user
+Switch to given user credentials after startup. Usually, this option is
+required when mongoose needs to bind on privileged port on UNIX. To do
+that, mongoose needs to be started as root. But running as root is a bad idea,
+therefore this option can be used to drop privileges. Example:
+
+    mongoose -listening_ports 80 -run_as_user nobody
+
+### url\_rewrite\_patterns
+Comma-separated list of URL rewrites in the form of
+`uri_pattern=file_or_directory_path`. When Mongoose receives the request,
+it constructs the file name to show by combining `document_root` and the URI.
+However, if the rewrite option is used and `uri_pattern` matches the
+requested URI, then `document_root` is ignored. Insted,
+`file_or_directory_path` is used, which should be a full path name or
+a path relative to the web server's current working directory. Note that
+`uri_pattern`, as all mongoose patterns, is a prefix pattern.
+
+This makes it possible to serve many directories outside from `document_root`,
+redirect all requests to scripts, and do other tricky things. For example,
+to redirect all accesses to `.doc` files to a special script, do:
+
+    mongoose -url_rewrite_patterns **.doc$=/path/to/cgi-bin/handle_doc.cgi
+
+Or, to imitate user home directories support, do:
+
+    mongoose -url_rewrite_patterns /~joe/=/home/joe/,/~bill=/home/bill/
+
+### hide\_files\_patterns
+A pattern for the files to hide. Files that match the pattern will not
+show up in directory listing and return `404 Not Found` if requested. Pattern
+must be for a file name only, not including directory name.
+
+# Common Problems
 - PHP doesn't work - getting empty page, or 'File not found' error. The
   reason for that is wrong paths to the interpreter. Remember that with PHP,
   correct interpreter is `php-cgi.exe` (`php-cgi` on UNIX). Solution: specify
-  full path to the PHP interpreter, e.g.
-  `mongoose -cgi_interpreter /full/path/to/php-cgi`
+  full path to the PHP interpreter, e.g.:
+    `mongoose -cgi_interpreter /full/path/to/php-cgi`
 
-## Embedding
+# Embedding
 Embedding Mongoose is easy. Somewhere in the application code, `mg_start()`
 function must be called. That starts the web server in a separate thread.
 When it is not needed anymore, `mg_stop()` must be called.  Application code
 can pass configuration options to `mg_start()`, and also specify callback
 functions that Mongoose should call at certain events.
-[hello.c](http://a.c) provides a minimalistic example.
+[hello.c](https://github.com/valenok/mongoose/blob/master/examples/hello.c)
+provides a minimalistic example.
 
 Common pattern is to implement `begin_request` callback, and serve static files
 from memory, and/or construct dynamic replies on the fly. Here is
@@ -205,7 +262,7 @@ directly into the executable. If such data needs to be encrypted, then
 encrypted database or encryption dongles would be a better choice.
 
 
-## Other Resources
+# Other Resources
 - Presentation made by Arnout Vandecappelle at FOSDEM 2011 on 2011-02-06
   in Brussels, Belgium, called
   "Creating secure web based user interfaces for Embedded Devices"
-- 
GitLab