# WASD Hypertext Services - Scripting Environment

## 4 - Run-Time Environments

> 4.1 - RTE Programming
> 4.2 - Server Configuration

[next] [previous] [contents] [full-page]

A Run-Time Environment (RTE) is a persistant scripting environment with similar objectives to CGIplus ... reducing script response time, increasing server throughput and reducing system impact. In fact the RTE environment is implemented using CGIplus! There is very little difference in the behaviour of CGIplus scripts and RTEs. Both are activated by the server, process multiple requests (reading the request CGI environment from a data stream supplied by the server), persist between requests in a quiescent state, and may be removed by the server if idle for a specified period or when it wishes to use the process for some other purpose. Like CGIplus an RTE must be purpose-written for the environment! What is the difference then?

With CGIplus the script itself persists between uses, retaining all of it's state. With an RTE the script does not persist or retain state, only the RTE itself.

A RTE is intended as an environment in which a script source is interpreted or otherwise processed, that is for scripting engines, although it is not limited to that. The essential difference between an RTE and a CGIplus script is this script source. In CGIplus the SCRIPT_NAME and SCRIPT_FILENAME CGI variables reflect the script itself, and remain constant for each activation of the script, with PATH_INFO and PATH_TRANSLATED providing the additional "location" information for the script processing. With an RTE the SCRIPT_NAME and SCRIPT_FILENAME can vary with each activation. This allows the RTE to process multiple, successive different (or the same) scripts, each with it's own PATH_INFO and PATH_TRANSLATED. Hence, it is not unreasonable to consider the two environments to be the same, with a slight difference in the mapping of resources passed to them.

This might be best illustrated with examples.

###
CGIplus Example

Consider the mapping rule

      exec+ /cgiplus-bin/* /cgi-bin/*

applied to the following CGIplus request

      /cgiplus-bin/xyz/the/path/information?and=a&query=string

If the script was an executable it would be activated as

      CGI-BIN:[000000]XYZ.EXE

with script CGI information

      /cgiplus-bin/xyz
      CGI-BIN:[000000]XYZ.EXE

and the request path information and query string supplied as

      /the/path/information
      THE:[PATH]INFORMATION
      and=a&query=string

###
RTE Example

By contrast with a request to activate an RTE the following mapping rule

      exec+ /xyz-bin/* (CGI-BIN:[000000]XYZ.EXE)/ht_root/src/xyz/*

(note the RTE executable specified inside parentheses) and request

      /xyz-bin/an_example/the/path/information?and=a&query=string

would activate the scripting environment (perhaps interpreter)

      CGI-BIN:[000000]XYZ.EXE

supplying it with per-request script name and file information

      /xyz-bin/an_example.xyz
      HT_ROOT:[SRC.XYZ]AN_EXAMPLE.XYZ

and path and query string information

      /the/path/information
      THE:[PATH]INFORMATION
      and=a&query=string

###
Summary

As can be seen the script information is constant for each request to a CGIplus script, while with RTE the script information could vary with each request (although of course it would be the same if the same script is requested). In the case of CGIplus the process what? request information is provided only by path information, however with RTE both script and path information are used.

###
4.1 - RTE Programming

The RTE interface is still CGI, with all the usual environment variables and input/output streams available, just in a CGIplus environment! Hence when coding a Run-Time Environment the same considerations involved in CGIplus programming apply (3 - CGIplus).

In particular it is important a RTE should explicitly close files, free allocated memory, etc., after processing a request (of course it cannot rely on image run-down to clean-up after itself). It is particularly important that all traces of each script's processing are removed after it concludes. This does not mean for example that databases need to be completely closed, etc., which might defeat the purpose of using a persistant environment, just that great care must be exercised by the programmer to prevent one script interfering with another!

An example RTE, HT_ROOT:[SRC.CGIPLUS]RTE_EXAMPLE.C provides the basics of the environment.

A source code collection of C language functions useful for processing the more vexing aspects of CGI/CGIplus/RTE programming (1.10 - Scripting Function Library). The example RTE implementation uses this library.

###
4.2 - Server Configuration

The following configuration information uses the supplied Perl RTE as the example. Note that RTE scripting engines must always be mapped using the EXEC+ rules. The SCRIPT+ rule does not apply.

The following rule in HTTPD$MAP maps the /pl-bin/ location to where the site wishes to locate it's CGI Perl scripts (not necessarily the same as in the example).

      exec+ /pl-bin/* (CGI-BIN:[000000]PERLRTE.EXE)/ht_root/src/perl/*

With this rule Perl scripts may be accessed using

      http://host.name.domain/pl-bin/an_example

A DCL procedure can be specified in place of an executable. Merely prefix the specification with a "@".

This HTTPD$CONFIG rule ensures Perl scripts could be activated via the Perl RTE even if the HTTPD$MAP rule did not exist (1.6 - Script Run-Time).

      [DclScriptRunTime]
      .PL  (CGI-BIN:[000000]PERLRTE.EXE)

> NOTE

> The server makes no check of the RTE executable (or procedure) before attempting to activate it using DCL for processing the script. If it does not exist or is not accessable due to incorrent file protections the DCL of the scripting process will report the problem.

It does by default however, check that the file used as the script source exists as with other scripting environments. If it does not this is reported as a "script not found". For RTEs that wish to report on this themselves, or that possibly construct their own script specification via some internal processing, this server behaviour may be suppressed for the script activation path using the HTTPD$MAP path SETting "script=nofind" as in the following example.

      set /xyz-bin/* script=nofind
      exec+ /xyz-bin/* (CGI-BIN:[000000]XYZ.EXE)/ht_root/src/xyz/*

[next] [previous] [contents] [full-page]