一个显示原代码的asp程序

作者:不详 来源: 日期:2002-6-20
我们都知道asp这一类的服务器端处理的程序,其好处之一就是只向客户端输出标准的Html
流。因此可以起到向客户隐藏细节的作用。也就是说当我们在浏览器中键入asp程序的网址
后只能看见标准的Html文件,而不能看见asp的内容。但有时,例如在一个asp的教学站点,
我们有必要显示asp文件的内容,或者你愿意将你的原代码与人享,通过一个程序将代码显
示出来。 

  下面是我编写的一个asp程序,view_code.asp,它提供两种提交方式:
  一种是用表格提交,即你知道了该源文件的物理地址(类似于:
c:\asp_source\test.asp的形式)。
  一种是采用get方式提交(类似于:< a href="view_code.asp?code_path= < %
=server.mappath(request.servervariables("PATH_INFO"))% >&cgi_type=asp" > 
点击此处查看原代码< /a >)。另外它还支持两种cgi脚本,一种是asp,一种是php。 
代码段: 
< % 
on error resume next 
’忽略程序执行中的错误,在程序的最后统一处理。 
% > 
< % 
function rt_min(num1,num2) 
’该子程序用于返回两数中不等于零的最小数。 
if num1=0 and num2=0 then 
rt_min=-1 
elseif num1=0 then 
rt_min=num2 
elseif num2=0 then 
rt_min=num1 
elseif num1 
rt_min=num1 
else 
rt_min=num2 
end if 
end function 
% > 


--------------------------------------------------------------------------------

< % 
function line_check(strline,cgi_type) 
’该子程序用于检查输入段中是否包含有"< %、% >、< script >或< /script的特殊字符 
dim cgi_flag 
if cgi_type="php" then 
cgi_flag="?" 
else 
cgi_flag="%" 
end if 
’定义的cgi_flag用于代表php和asp的不同标识符 
line_check=0 
itemp=0 
ipos=instr(strline,"<"&cgi_flag) 
if rt_min(ipos,itemp)=ipos then 
itemp=ipos 
line_check=1 
end if 
ipos=instr(strline,cgi_flag&" >") 
if rt_min(ipos,itemp)=ipos then 
itemp=ipos 
line_check=2 
end if 
ipos=instr(1,strline,"<"&"script",1) 
if rt_min(ipos,itemp)=ipos then 
itemp=ipos 
line_check=3 
end if 
ipos=instr(1,strline,"<"&"/script",1) 
if rt_min(ipos,itemp)=ipos then 
itemp=ipos 
line_check=4 
end if 
end function 
% > 



--------------------------------------------------------------------------------

  < % 

sub printhtml(strline) 
’该子过程用于打印不含有上述四种特殊标记的行 
ispace=len(strline)-len(ltrim(strline)) 
i=1 
while(mid(strline,i,1))=chr(9) 
ispace=ispace+5 
i=i+1 
wend 
’统计空白的数量 
if ispace >0 then 
for i=1 to ispace 
response.write(" ") 
next 
end if 
ipos=instr(strline,"<") 
if ipos then 
response.write(left(strline,ipos-1)) 
response.write("<") 
’用<来替代<,使浏览器不解释< >中的标记 
strline=right(strline,len(strline)-ipos) 
call printhtml(strline) 
’自调用,直到没有<的出现 
else 
response.write(strline) 
end if 
end sub 
% > 


--------------------------------------------------------------------------------

< % 
sub printline(strline,iflag,cgi_type) 
’该自过程用于根据line_check的返回值分别处理 
dim cgi_flag 
if cgi_type="php" then 
cgi_flag="?" 
else 
cgi_flag="%" 
end if 
select case iflag 
case 0 
call printhtml(strline) 
case 1 
ipos=instr(strline,"<"&cgi_flag) 
call printhtml(left(strline,ipos-1)) 
response.write("< font color=#ff0000 >") 
response.write("<"&cgi_flag) 
strline=right(strline,len(strline)-ipos-1) 
call printline(strline,line_check(strline,cgi_type),cgi_type) 
’自调用,直到没有四种特殊标记的出现 
case 2 
ipos=instr(strline,cgi_flag&" >") 
call printhtml(left(strline,ipos-1)) 
response.write(cgi_flag&" >") 
response.write("< /font >") 
strline=right(strline,len(strline)-ipos-1) 
call printline(strline,line_check(strline,cgi_type),cgi_type) 
case 3 
ipos=instr(1,strline,"<"&"script",1) 
call printhtml(left(strline,ipos-1)) 
response.write("< font color=#00ff00 >") 
response.write("<"&"script") 
strline=right(strline,len(strline)-ipos-6) 
call printline(strline,line_check(strline.cgi_type),cgi_type) 
case 4 
ipos=instr(1,strline,"<"&"/script >",1) 
call printhtml(left(strline,ipos-1)) 
response.write("lt;"&"/script"&" >") 
response.write("< /font >") 
strline=right(strline,len(strline)-ipos-8) 
call printline(strline,line_check(strline,cgi_type),cgi_type) 
case else 
response.write("error") 
end select 
end sub 
% > 


--------------------------------------------------------------------------------

< html > 
< head > 
< title > view cgi_code(.asp or .php) < /title > 
< /head > 
< body > 
< form action="view_code.asp" method="POST" > 
请输入路径:< input type=text name="code_path" > 
请选择类型:< select name="cgi_type" > 
< option value="asp" >asp< /option > 
< option value="php" >php< /option > 
< /select > 
< input type=submit > 
< /form > 
< hr > 
< % 
if vartype(request.servervariables("HTTP_REFERER")) then 
’判断该页面是否是由其他的页面申请提交,若用户是直接在浏览器中输入地址 
而来的,则HTTP_REFERER环境变量应该没有被初始化 
if request.servervariables("REQUEST_METHOD")="POST" then 
code_path=request.form("code_path") 
cgi_type=request.form("cgi_type") 
response.write("下面的代码来自表格的提交:"&"< br >") 
response.write("路径为:"&code_path&"< br >") 
elseif request.servervariables("REQUEST_METHOD")="GET" then 
code_path=request.querystring("code_path") 
cgi_type=request.querystring("cgi_type") 
response.write("下面的代码来自"&code_path&"的提交:"&"< br >") 
response.write("路径为:"&code_path&"< br >") 
end if 
’根据提交方式的不同显示不同的提示 
set fileobject=server.createobject("Scripting.FileSystemObject") 
if fileobject.fileexists(code_path) then 
’检查要打开的文件是否存在 
set stream=fileobject.opentextfile(code_path,1,false,0) 
while not stream.atendofstream 
stroutput=stream.readline 
call printline(stroutput,line_check(stroutput,cgi_type),cgi_type) 
’将该文件的每一行都分别交给printline来处理 
response.write("< br >") 
wend 
set stream=nothing 
else 
response.write("不能打开文件"&"< br >") 
end if 
end if 
% > 
< /body > 
< /html > 


--------------------------------------------------------------------------------
< % 
’下面的代码为统一的错误处理段,它根据程序运行时产生的错误代码来分别处理 
if err.number< >0 then 
response.write("error"&"< br >") 
response.write("错误代码:"&err.number&"< br >") 
response.write("错误描述:"&err.description) 
end if 
% > 
最后,我在给出一个引用该程序的测试页面 
< html > 
< head > 
< title >显示代码的测试页面< /title > 
< /head > 
< body > 
< a href="view_code.asp?code_path=&cgi_type=asp" >点击此处查看该页的源码< /a > 
< /body > 
< /html > 
相关文章