# XS-HTTPD SSI's

One of the most advanced features of this WWW server is its server side includes. Server side includes (SSI's) are "commands" to the server to do something. These may be embedded in HTML documents.

The format of such a directive is as follows:
`<!--#`name [argument(s)]`-->`

name is the name of the directive. You may specify arguments to the directive if needed or wanted, seperated from the directive's name by one space. Note also that a directive must start and end on the same line. You may have other things on that line, including other directives.

When the server sends a HTML document to the remote client, it will parse all of the directives that are embedded in that document. The possible directives are:

count-total
  This directive inserts the number of times that this page has ever been retrieved. You may use counters as many times as you wish per page, they will only increment once.
count-month
  This directive inserts the number of times that this page has been retrieved this month.
count-today
  This directive inserts the number of times that this page has been retrieved today.
count-total-gfx [location]
  This directive inserts a HTML tag to include a graphical representation of the number of times that this page has ever been retrieved. If location is specified, it will be used as a base location for the font. A font has 10 digits in it, each in a seperate file, all PPM's. Say location is /~user/font1, and digit `1` is needed, then /~user/font1/1.ppm will be used as that digit.

  Two default fonts are supplied with the deamon. These may be accessed with locations: `/fonts/digital` and `/fonts/large`.

count-month-gfx [location]
  This directive inserts a HTML tag to include a graphical representation of the number of times that this page has been retrieved this month. See above for location.
count-today-gfx [location]
  This directive inserts a HTML tag to include a graphical representation of the number of times that this page has been retrieved today. See above for location.
date
  This directive inserts the current date and time, optionally in your own format. You can specify your own date and time format using the date-format directive (see below).
date-format format
  This directive uses format as the new date and time format. You must specify the format in strftime(3) format. Type `man strftime` for help on how to use this format.
include-file file
  This directive allows you to include another file in this document. Very useful for standard headers and footers. Note that included files may be nested and that directives are parsed in them. Note also that counters and such always count the original file, so you can use the count-* directives in your standard headers and footers.
last-mod [file]
  This directive (with a pseudonym last-modified inserts the last modification date of either the originally request file (the current document) or the optionally specified file. The date will be in the format specified by the date-format directive.
remote-host
  Inserts the name (or the IP number if the name cannot be resolved) of the remote computer that is asking for this document.
run-cgi cgi
  Runs the CGI binary cgi and inserts its output at this point. Standard PATH_INFO and PATH_TRANSLATED parsing is done, so you can give argumens to the CGI binary. All standard CGI environment variables will be set up appriopriately. See the CGI section for more details on CGI's.
agent-short
  This directive inserts the name of the browser that the remote user is using in the short version (i.e. without the version number). Note that Netscape is displayed as Mozilla, which is Netscape's real name.
agent-long
  This directive inserts the name of the browser that the remote user is using in the long version (i.e. with version numbers and other comments that the browser sends).
if keyword pattern(s)
  The following four directive are the most powerful: they allow a kind of flow control in your documents. This directive displays all text and directives after it until it encounters an endif or a else directive, if the query evaluates to true.

  Possible keywords are:

  browser
    If any of the patterns match the browser name that the remote user if using, the query evaluates to true, otherwise it evaluates to false. See below on how to specify patterns.
  remote-host
    If any of the patterns match the remote host's name or IP number, the query evaluates to true, otherwise it evaluates to false.
  remote-name
    If any of the patterns match the remote host's name, the query evaluates to true, otherwise it evaluates to false.
  remote-addr
    If any of the patterns match the remote host's IP number, the query evaluates to true, otherwise it evaluates to false.
  argument
    It is possible (since version 2.1) to pass arguments to HTML documents. If any of the patterns match the given argument, the query evaluates to true, otherwise it evaluates to false.

    Arguments are passed by appending a question mark to the page's URL and giving the arguments after that. For example:
    `http://www.foo.bar/~test/blah.html?this_is_an_argument`

  Patterns are simple wildcard patterns (case-insensitive). For example, to match any version of Netscape (which is really called Mozilla), you would use `mozilla/*`. If you want to match any Mosaic version 2, you would use `*Mosaic*/2*`.

  A browser's name is always constructed in the following way:
  browsername/version extra/version

if-not keyword pattern(s)
  This does exactly the same as if, except that it displays the following text only if the query evaluates to false instead of true.
else
  This can be used after an if or if-not directive. The meaning is obvious.
endif
  Ends an if or not-if. Note that these constructions may be nested!