搜索
查看: 1598|回复: 3

用aardio的simpleHttpServer实现python例程中的HTTP服务器功能

[复制链接]

13

主题

61

帖子

434

积分

二级会员

Rank: 3Rank: 3

积分
434
发表于 2017-10-31 13:13:34 | 显示全部楼层 |阅读模式
  1. var html = /**
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
  3. <title>Directory listing for /</title>
  4. <body>
  5. <h2>Directory listing for <?=rget(2,...)?></h2>
  6. <hr>
  7. <ul>
  8. <?
  9.         import console;
  10.         import fsys;
  11.         var path = ...;
  12.         var i = 0;
  13.         fsys.enum( path, "*.*",
  14.         function(dir,filename,fullpath,findData){
  15.                         i=i+1;
  16.                         if(filename){
  17.                                 print('<li><a href="'+filename+'">'+tostring(i)+") "+filename+'</a><br>\r\n');
  18.                         }
  19.                         else{
  20.                                 print("<li><a href='"+dir+"/'>"+tostring(i)+") "+dir+"/</a><br>")
  21.                         }
  22.                 }
  23.                 ,false
  24.         );       
  25. ?>
  26. </ul>
  27. <hr>
  28. </body>
  29. </html>
  30. **/;
  31. if !io.exist("/html.aardio") string.save("/html.aardio", html);
  32. import wsock.tcp.simpleHttpServer;
  33. import console;
  34. import process;
  35. var server = wsock.tcp.simpleHttpServer("127.0.0.1");
  36. process.execute(server.getUrl());
  37. console.log("启动:",server.getUrl());
  38. server.run(
  39.         function(response,request,winform){
  40.             import fsys;
  41.             var path = request.path;
  42.             //设置根目录
  43.             path = fsys.path.replaceDir(path,"/","c:");
  44.             console.log(request.method,request.path);
  45.             if (fsys.isDir(path))
  46.             {       
  47.                         response.loadcode("/html.aardio",path,request.path)
  48.             }
  49.             else {
  50.                 response.loadcode( path );
  51.             }
  52.         },winform        
  53. );
复制代码

可以通过这句代码设置根目录
path = fsys.path.replaceDir(path,"/","c:\");

但是好像simpleHttpServer中限制了根目录只能是当前运行的目录
if( ! ..fsys.path.ischild( "/",path ) ){
        return response.errorStatus(403);
}

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-10-31 13:42:40 | 显示全部楼层
aardio里的“/”(或"\") 开头的路径表示应用程序根目录。
这个根目录在程序运行期间不能随意修改,aardio到处都是使用这样的路径,随意修改的话程序就会乱套。

但 aardio也提供了一种可能,就是在运行期间你可以修改“/”的指向,
例如 fastcgi就是用这个机制实现了每个网站的 "/"都指向自己网站的根目录。

simpleHttpServer 就没有做这个事情,但是我们可以自己加这个功能,
aardio修改应用程序根目录有两种方法:

1、创建线程的时候,如果启动线程的是一个aardio文件,aardio文件所在的目录会被设置为应用程序根目录。
2、创建协程时,可以在参数中动态指定应用程序根目录。

举个例子:
var f = fiber.create(
   
function(){
        
//下面写你原来的代码,"/"已经指向"c:\"了
        response.loadcode( "/html.aardio" ,path,request.path);
    },
"c:\"
);
fiber.resume (f)
最后提醒一下:把C:\盘暴露到网络,要注意安全。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-10-31 15:38:20 | 显示全部楼层
刚才去看了一下wsock.tcp.simpleHttpServer的源码,
原来已经基本实现了自定义网站目录的功能(原理看上面的回复),
所以我更新了一下,只要加个参数传给 documentRoot就行。

更新 aardio v14.03以后,
写个网站文件浏览器就省心了(运行以下的代码,D盘文件可通过HTTP下载,谨慎测试):
import console;
import process;
import wsock.tcp.simpleHttpServer;

var srvHttp = wsock.tcp.simpleHttpServer()
srvHttp.documentRoot =
"d:\"

console.log(srvHttp.getUrl());
process.execute(srvHttp.getUrl());

srvHttp.run(
   
function(response,request){
        
import fsys;
        
import inet.url;
        
        
if(!fsys.isDir(request.path) ) {
            
if( ..io.exist(request.path) )
                response.loadcode(request.path)
            
else {
                request.path = fsys.getParentDir(request.path)
            }
        }
        
        response.write(
" <title>Directory listing for /</title>
<body><h2>Directory listing for"
,request.path,"</h2><hr><ul>")

        
var file,dir = fsys.list(request.path,,"*.*");
        
for(i=1;#dir;1){
            response.write(
'<li><a href="'
                ,inet.url.append(request.path,dir[ i ])
                ,
'">'+tostring(i)+") ",dir[ i ],'</a><br>\r\n');
        
        }
        
        
for(i=1;#file;1){
            response.write(
'<li><a href="'
                ,inet.url.append(request.path,file[ i ])
                ,
'">'+tostring(i)+") ",file[ i ],'</a><br>\r\n');
        
        }
    }
)

回复

使用道具 举报

13

主题

61

帖子

434

积分

二级会员

Rank: 3Rank: 3

积分
434
 楼主| 发表于 2017-11-1 08:28:12 | 显示全部楼层
更新试了下,很好用,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-24 07:36 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表