function HttpFilterProc(var pfc:THTTP_FILTER_CONTEXT;Notificationtype:DWORD;pvNotification:Pointer):DWORD;stdcall;
var
p:PHTTP_FILTER_RAW_DATA;
i:integer;
pc:pchar;
begin
if Notificationtype=$80 then
//是SF_NOTIFY_END_OF_REQUEST将pFilterContext复位
begin
pfc.pFilterContext:=nil;
end
else
begin
p:=PHTTP_FILTER_RAW_DATA(pvNotification);
pc:=p^.pvInData;
case integer(pfc.pFilterContext) of
0://第一次调用,要检查MIME
begin
pfc.pFilterContext:=pointer(2);
i:=0;
while i<p^.cbInBuffer-4-1do
begin
if (pc^=’/’)and(pc^[i+1]=’h’)and(pc^[i+2]=’t’)and(pc^[i+3]=’m’)
then begin
pfc.pFilterContext:=pointer(1);
//是HTML
break;
end;
inc(i);
end;//endofwhile
end;
1://HTML数据
begin
pfc.pFilterContext:=pointer(3);
//将pc转换内码
gb2big(pc,p^.cbInBuffer);
end;
3://http1.1100contimue
begin
pfc.pFilterContext:=pointer(1);
end;
end;//endofcase
end;
//总是返回成功,并且如果有其他过滤器的话,还将继续调用
result:=SF_STATUS_REQ_NEXT_NOTIFICATION;
end;
下面是完整的程序文件(gb2bigfiler.dpr),其中的u_gb2big_tab单元完成GB码到BIG5,码的转换,这里不再细述,有兴趣的读者可以到后文提到的笔者的站点去下载源码。
library gb2bigfiler;
uses
SysUtils,math,Classes,windows,
isapi2,//delphi中ISAPI过滤器单元
u_gb2big_tab;//包含将GB码转换成BIG5码的过程gb2big
//下面两个函数的定义见上文
function HttpFilterProc(...);begin...end;
function GetFilterVersion(...);begin...end;
exports
HttpFilterProc index 1,GetFilterVersion index 2;
Begin end.
读者一定注意到了,这个过滤器将所有返回的HTML都转换成了BIG5码,那么GB码又如何看到呢?当然可以在过滤器中检查一些环境变量来决定用户所要求的是GB还是BIG5,可是这样做除了比较麻烦外,还存在效率问题,因为每个请求都要被过滤器处理。
笔者采用的方法是利用IIS4.0中可以设置多个站点的功能,设置两个站点。一个不含过滤器,所以GB内容高效直接的返回给GB用户;而另一个站点使用另外一个端口比如81,所有虚拟目录和前一个站点一样,将过滤器加载在该站点上,这样所有向81端口的请求,都将被过滤器转换成BIG5码返回给用户。
下面简述一下具体配置过程。首先在delphi中选择新建一个DLL,输入程序源码,编译后生成gb2bigfiler.DLL文件。在 IIS4.0 的管理控制台中,选"新建站点",主目录和缺省站点一样,端口设为81,在ISAPI过滤器中选择"添加",将gb2bigfiler.DLL加入。
设置好后,可以浏览81端口(例如:http://www.yoursite.com:81/your.html),这时原来GB码的内容就变成了BIG5码了。
有兴趣的读者可以访问http://202.96.122.45/qq,起始页可以选择内码,随后浏览的内容包括静态的HTML文本,放在数据库中的《红楼梦》、《唐诗》、完全动态更新的BBS,都可以做到用两种内码显示。