ACS Documentation : ACS Core Architecture Guide : ACS Request Processor
/web/arsdigita/www to the URL,
serving up the file named by that path.
This is no longer the case: the process of responding to a request involves many more steps than simply resolving a path and delivering a file. Serving an ACS page involves (at the very least) reading security information from HTTP cookies, extracting subcommunity information from the URL, calling filters and registered procedures, invoking the abstract URL system to determine which file to serve, and then actually serving the file.
The traditional way to realize this process was to register a plethora of filters and procedures, but there were several problems with this approach:
/www directory), as in
the case of pages associated with packages.
ns_register_procs for each possible URL prefix
(/groups, /some-group-type,
/some-group-name, etc.).
/download/files/ wouldn't work for requests under
/groups/some-group-name/download/files/62/smug.jpg.
ns_register_filters and
ns_register_procs), allowing us a great deal of control over exactly what
happens when we deliver a response to an HTTP request. We also introduced new APIs,
ad_register_filter and ad_register_proc, analogous to existing
AOLserver APIs (ns_register_filter and ns_register_proc) but tightly
integrated into the request processor.
preauth filter.
In fact, it is the only filter ever registered with AOLserver. We've killed off
ns_register_filter and ns_register_proc - see
the API below. It contains the following steps:
ad_conn global variable,
which contains information about the connection (see
ad_conn below).
*-procs.tcl files,
source them.
Also examine any files registered to be watched (via the package manager);
if any have been changed, source them as well.
Host header to make
sure it's what we expect it to be. If the Host header is present
but differs from the canonical server name (as reported by ns_info
location), issue an HTTP redirect using the the correct, canonical
server name.
For instance, if someone accesses the URL
http://arsdigita.com/pages/customers, we redirect them to
http://www.arsdigita.com/pages/customers since the canonical
host name for the server is www.arsdigita.com, not
arsdigita.com.
ad_browser_id
and ad_session_id. If either is is invalid or not present at all,
issue a cookie and note information about the new browser or session in the
database.
/groups/Boston/address-book/ belongs to
the Boston subcommunity), strip the subcommunity information from the URL
and save it in the environment to be later accessed by ad_conn.
This is not implemented in ACS 3.3.
ad_register_filter. Use
the URL with subcommunity stripped as the string to be matched against
patterns passed to ad_register_filter, e.g. if a
filter is registered on /download/files/, it will be applied
on URLs like /groups/Boston/download/files/* since we stripped
/groups/Boston from the URL in the step above.
ad_register_proc,
invoke it. As in the previous step, match using the URL minus
subcommunity information. If such a procedure is found, the process
terminates here.
First resolve the path:
rp_register_directory_map, map to the associated directory
in the filesystem. For example, if we've called
then all requests under therp_register_directory_map "apm" "acs-core" "apm-docs"
/apm URL stub are mapped to
the acs-core package directory apm-docs/www,
and all requests under /admin/apm are mapped to the
acs-core package directory apm-docs/admin-www.
www or
admin-www directory in that package. For example, if
there's a package named address-book, then
requests under /address-book are mapped to the
/packages/address-book/www directory, and requests under
/admin/address-book are mapped to
/packages/address-book/admin-www.
/web/arsdigita/www) to the URL, just like AOLserver
always used to do.
Now check to see if the path refers to a directory without a trailing
slash, e.g. a request to http://www.arsdigita.com/address-book.
If this is the case, issue a redirect to the directory with the trailing
slash, e.g. http://www.arsdigita.com/address-book/. This is
necessary so the browser will properly resolve relative HREFs.
Next determine which particular file to serve. If our file name is
filename, check to see if any files exist which are named
filename.*, i.e. we try automatically adding an extension to the
file name. If the URL ends in a trailing slash, then no file name is provided
so we look for an index.* file instead.
Give precedence to particular extensions in the order specified
by the ExtensionPrecedence parameter, e.g. in general
prefer to serve .tcl files rather than .adp
files.
.tcl) file, source it;
if it's an ADP (.adp) file, parse it.
In either case, if the script or ADP built a document using the
documents API, invoke the document handler
to route the document to the appropriate master template.
ad_serve_html to serve it,
including a comment link as appropriate.
rp_register_extension_handler, use that handler to serve
the file. For example, if I call
then if the file is a JSP (rp_register_extension_handler jsp jsp_handler
.jsp) file, the jsp_handler
routine will be called and expected to return a page.
filter_return, i.e.
it is always solely responsible for returning a page. Essentially it commandeers
the entire AOLserver page delivery process.
ns_register_filter and ns_register_proc are
dead - trying to use them causes an error. Instead of these two procedures, you'll need
to use ad_register_filter and ad_register_proc, drop-in
replacements which provide the same functionality but are integrated into the request
processor.
ad_register_filter when method URLpattern script [ args ... ]
ad_register_proc [ -noinherit f ] method URL procname [ args ... ]
ns_register_filter and ns_register_proc.
See the AOLserver
documentation for syntax.
ad_conn which
ns_conn). Allowed values for which are:
url: same as ns_conn url.
(In future versions of ACS with subcommunity support,
this will return the portion of the URL after any subcommunity
information. For instance, for a URL request to
/groups/Boston/address-book/, it would return
/address-book/.)
canonical_url: returns a URL, minus extension,
which is consistent
no matter what URL is used to access a resource. For instance, if any
of the following URLs are used to access the address book:
Boston office:
then the canonical URL for each might be/address-book/ /address-book/index /address-book/index.tcl
This URL is useful whenever a consistent, unique identifier for a resource is necessary, e.g. storing URLs for general comments./address-book/index
full_url: similar to ad_conn canonical_url,
except that the extension of the file is included. For instance, in the case of
the example above, ad_conn full_url would return
/address-book/index.tcl
file: returns the absolute path in the filesystem
of the file which is being delivered. If the request does not correspond
to a file (e.g. is a registered filter or procedure), returns an empty string.
extension: returns the extension of the file
which is being delivered (equivalent to [file extension [ad_conn file]]).
If the request does not correspond to a file (e.g. is a registered filter or procedure),
returns an empty string.
browser_id: returns the client's browser ID
(see the document security and session-tracking).
session_id: returns the client's session ID
(see the document security and session-tracking).
[ns/server/yourservername/request-processor] ; Log lots of timestamped debugging messages? DebugP=0 ; URL sections exempt from Host header checks and security/session handling. ; (can specify an arbitrary number). SystemURLSection=SYSTEM
Integration with subcommunities.