Apache HTTP Server的1.3版是第一个版本,其中包括(非ASCII)大型机的端口,该主机使用EBCDIC字符集作为其本机代码集。
(这是运行BS2000 / OSD操作系统的SIEMENS大型机系列。如今,该大型机OS具有SVR4衍生的POSIX子系统)。
该端口最初是为了
本文档是描述本机端口的一些设计决策的依据。
EBCDIC端口的一个目标是保持与(EBCDIC)CERN服务器的足够的向后兼容性,以使向新服务器的转换有吸引力且容易。这就需要添加一种可配置的方法来定义HTML文档是以ASCII(旧服务器接受的唯一格式)还是以EBCDIC(POSIX子系统中的本机文档格式)存储,因此是唯一的实际格式。其他POSIX工具,例如grep
或
sed
可以在文档上运行)。当前的解决方案是由Apache服务器拦截并解释的“伪MIME格式”(请参阅下文)。将来的版本可能会通过为所有必须转换的文档定义一个“ ebcdic-handler”来解决该问题。
由于所有Apache输入和输出均基于BUFF数据类型及其方法,因此最简单的解决方案是将转换添加到BUFF处理例程中。必须随时可以设置转换,因此添加了BUFF标志,该标志定义BUFF对象当前是否已启用转换。该标志在HTTP协议中的几个地方被修改:
来源中的相关更改#ifdef
分为两类:
#ifdef
CHARSET_EBCDIC
任何基于EBCDIC的机器所需的代码。这包括字符转换,两个字符集的连续性差异,标志,这些标志指示必须转换HTTP协议的哪个部分而不必转换哪个部分等。
#ifdef _OSD_POSIX
仅SIEMENS BS2000 / OSD大型机平台所需的代码。这涉及仅在BS2000 / OSD平台上才需要的文件差异和套接字实现主题。
故意没有选择在套接字级别(在BS2000 POSIX上,有一个支持该选项的套接字选项)在ASCII和EBCDIC之间进行转换的可能性,因为HTTP协议级别的字节流由协议相关的字符串和非-协议相关的原始文件数据。HTTP协议字符串始终以ASCII编码(GET
请求,任何Header:行,分块信息等),而文件传输部分(即 GIF图像,CGI输出等))通常应该仅由服务器“通过”。服务器协议中的“协议字符串”和“原始数据”之间的这种分隔通过诸如字符串的函数bgets()
或针对二进制数据的rvputs()
函数
反映在服务器代码中bwrite()
。因此,对所有内容进行全球翻译是不够的。
(当然,对于文本文件,必须做出规定,以便始终以ASCII形式提供EBCDIC文档)
因此,此端口具有针对服务器内部字符串(编译器将其转换为EBCDIC字符串)以及所有服务器生成的文档的内置协议级别转换的功能。硬编码的ASCII逃逸
\012
和\015
其在服务器代码无处不是一个例外:他们已经是ASCII的二进制编码\n
和\r
,并且必须不被转换为ASCII的第二时间。此异常仅与服务器生成的字符串有关;和外部 EBCDIC文档不应包含ASCII换行符。
通过检查BUFF管理例程的调用层次结构,我添加了一个“ ebcdic / ascii转换层”,该层将在每个puts / write / get / gets上交叉使用,以及一个转换标志,该标志允许在启用/禁用转换的情况下进行转换。飞。通常,文档从其原始源(文件或CGI输出)到其目的地(发出请求的客户端)两次穿过该层:file ->
Apache
和Apache -> client
。
服务器现在可以读取EBCDIC格式的CGI脚本输出的标题行,然后发现脚本输出的其余部分为ASCII(例如WWW Counter程序的输出:文档主体包含GIF图片)。所有标头处理均以本机EBCDIC格式完成;然后,服务器根据提供的文档类型确定文档主体(当然,分块信息除外)是否已经是ASCII格式,或者是否必须从EBCDIC转换。
对于文本文档(MIME类型为text / plain,text / html 等),可以使用隐式转换为ASCII,或者(如果用户更喜欢以原始ASCII格式存储某些文档,以便更快地提供服务,或者因为文件位于无需转换即可提供NFS挂载的目录树)。
例:
要将后缀.ahtml
作为原始ASCII text/html
文档而不进行隐式转换(后缀.ascii
为ASCII
text/plain
)的文件,请使用以下指令:
AddType text/x-ascii-html .ahtml
AddType text/x-ascii-plain .ascii
同样,text/foo
通过text/x-ascii-foo
使用为其配置MIME类型“ ”
,任何MIME类型都可以用作“原始ASCII” AddType
。
非文本文档始终以“二进制”形式提供,而不进行转换。对于,,这似乎是最明智的选择。例如,GIF / ZIP / AU文件类型。当然,这需要用户使用rcp -b
二进制开关将它们复制到大型机主机。
服务器解析的文件始终假定为机器上使用的本机(即 EBCDIC)格式,并在处理后进行转换。
对于CGI输出,CGI脚本确定是否需要转换:通过设置适当的Content-Type,可以转换文本文件,或者可以通过未修改的方式传递GIF输出。后一种情况的一个示例是我们也移植的wwwcount程序。
服务器将所有以a Content-Type:
开头的文件text/
均视为二进制文件,并且不进行任何转换。二进制文件的示例是GIF图像,gzip压缩文件等。
在大型机主机与Unix机器或Windows PC之间交换二进制文件时,请确保使用ftp“ binary”(TYPE I
)命令,或使用rcp -b
大型机主机上的
命令(-b
unix不支持此
开关
rcp
)。
服务器的默认假设是文本文件(即,所有Content-Type:
以开头的文件text/
)存储在主机EBCDIC的本机字符集中。
SSI文档当前必须仅存储在EBCDIC中。没有规定在处理之前将其从ASCII转换。
模组 | 状态 | 笔记 |
---|---|---|
core |
+ | |
mod_access |
+ | |
mod_actions |
+ | |
mod_alias |
+ | |
mod_asis |
+ | |
mod_auth |
+ | |
mod_authn_anon |
+ | |
mod_authn_dbm |
? | 与自己 libdb.a |
mod_authz_dbm |
? | 与自己 libdb.a |
mod_autoindex |
+ | |
mod_cern_meta |
? | |
mod_cgi |
+ | |
mod_digest |
+ | |
mod_dir |
+ | |
mod_so |
-- | 没有共享库 |
mod_env |
+ | |
mod_example |
-- | (仅限测试床) |
mod_expires |
+ | |
mod_headers |
+ | |
mod_imagemap |
+ | |
mod_include |
+ | |
mod_info |
+ | |
mod_log_agent |
+ | |
mod_log_config |
+ | |
mod_log_referer |
+ | |
mod_mime |
+ | |
mod_mime_magic |
? | 尚未移植 |
mod_negotiation |
+ | |
mod_proxy |
+ | |
mod_rewrite |
+ | 未经测试 |
mod_setenvif |
+ | |
mod_speling |
+ | |
mod_status |
+ | |
mod_unique_id |
+ | |
mod_userdir |
+ | |
mod_usertrack |
? | 未经测试 |
模组 | 状态 | 笔记 |
---|---|---|
JK (Formerly mod_jserv)
|
-- | JAVA仍在移植。 |
mod_php3 |
+ | mod_php3 使用LDAP和GD以及FreeType库,运行良好。 |
mod_put |
? | 未经测试 |
mod_session |
-- | 未经测试 |