|The Apache HTTP Server Reference Manual
by Apache Software Foundation
Paperback (6"x9"), 862 pages
RRP £19.95 ($29.95)
- The relevant changes in the source are #ifdef’ed into two categories:
- #ifdef CHARSET_EBCDIC
Code which is needed for any EBCDIC based machine. This includes character translations, differences in contiguity of the two character sets, flags which indicate which part of the HTTP protocol has to be converted and which part doesn’t etc.
- #ifdef _OSD_POSIX
Code which is needed for the SIEMENS BS2000/OSD mainframe platform only. This deals with include file differences and socket implementation topics which are only required on the BS2000/OSD platform.
- The possibility to translate between ASCII and EBCDIC at the socket level (on
BS2000 POSIX, there is a socket option which supports this) was intentionally
not chosen, because the byte stream at the HTTP protocol level consists of a
mixture of protocol related strings and non-protocol related raw file
data. HTTP protocol strings are always encoded in ASCII (the GET
request, any Header: lines, the chunking information etc.) whereas the file
transfer parts (i.e., GIF images, CGI output etc.) should usually be just
"passed through" by the server. This separation between "protocol
string" and "raw data" is reflected in the server code by functions
like bgets() or rvputs() for strings, and functions like bwrite() for
binary data. A global translation of everything would therefore be
(In the case of text files of course, provisions must be made so that EBCDIC documents are always served in ASCII)
- This port therefore features a built-in protocol level conversion for the server-internal strings (which the compiler translated to EBCDIC strings) and thus for all server-generated documents. The hard coded ASCII escapes \012 and \015 which are ubiquitous in the server code are an exception: they are already the binary encoding of the ASCII \n and \r and must not be converted to ASCII a second time. This exception is only relevant for server-generated strings; and external EBCDIC documents are not expected to contain ASCII newline characters.
- By examining the call hierarchy for the BUFF management routines, I
added an "EBCDIC/ASCII conversion layer" which would be crossed
on every puts/write/get/gets, and a conversion flag which allowed
enabling/disabling the conversions on-the-fly. Usually, a document crosses
this layer twice from its origin source (a file or CGI output) to its
destination (the requesting client): file -> Apache, and Apache ->
The server can now read the header lines of a CGI-script output in EBCDIC format, and then find out that the remainder of the script’s output is in ASCII (like in the case of the output of a WWW Counter program: the document body contains a GIF image). All header processing is done in the native EBCDIC format; the server then determines, based on the type of document being served, whether the document body (except for the chunking information, of course) is in ASCII already or must be converted from EBCDIC.
- For Text documents (MIME types text/plain, text/html etc.), an implicit
translation to ASCII can be used, or (if the users prefer to store some
documents in raw ASCII form for faster serving, or because the files reside on a
NFS-mounted directory tree) can be served without conversion.
AddType text/x-ascii-html .ahtml
AddType text/x-ascii-plain .ascii
Similarly, any text/foo MIME type can be served as "raw ASCII" by configuring a MIME type "text/x-ascii-foo" for it using AddType.
- Non-text documents are always served "binary" without conversion. This seems to be the most sensible choice for, .e.g., GIF/ZIP/AU file types. This of course requires the user to copy them to the mainframe host using the "rcp -b" binary switch.
- Server parsed files are always assumed to be in native (i.e., EBCDIC) format as used on the machine, and are converted after processing.
- For CGI output, the CGI script determines whether a conversion is needed or not: by setting the appropriate Content-Type, text files can be converted, or GIF output can be passed through unmodified. An example for the latter case is the wwwcount program which we ported as well.
|ISBN 9781906966034||The Apache HTTP Server Reference Manual||See the print edition|