root/lang/haxe/Tonyu2/httpd/Server.hx @ 35958

Revision 35958, 2.1 kB (checked in by hoge1e3, 4 years ago)
Line 
1package httpd;
2class Server {
3        //public void onRequest(Request req,Response res) {}
4        public static function start(port:Int, handler: Request->Response->Void) {
5                var headp= ~/^(GET|POST|PUT|DELETE) ([^ ]+)/;
6                var clenp= ~/^Content-Length: *([0-9]+)/i;
7        var s = new neko.net.Socket();
8        s.bind(new neko.net.Host("localhost"),port);
9        s.listen(1);
10                var cnt=1;
11        trace("Starting server...");
12        while( true ) {
13            var c : neko.net.Socket = s.accept();
14            trace("Client connected...");
15                        var method="";
16                        var req=new Request();
17                        var path="";
18                        var len=0;
19                        while( true ) {
20                                var l = c.input.readLine();
21                               
22                                if (headp.match(l)) {
23                                        method=headp.matched(1);
24                                        path=headp.matched(2);
25                                }
26                                if (clenp.match(l)) {len=Std.parseInt(clenp.matched(1));   }
27                                trace(""+cnt+": "+l);
28                                if( l == "" ) {
29                                        //s.close();
30                                        //ar b=Bytes.alloc(len);
31                                        if (method=="POST") {
32                                                req.content=c.input.readString(len);
33                                                break;
34                                        }
35                                        break;
36                                }
37                        }
38                        var p;
39                        var params=new Hash<String>();
40                        var sp=req.content.split("&");
41                        trace(req.content+"  -  "+sp.length+" / "+sp);
42                        for (p in req.content.split("&")) {
43                                var r=p.split("=");
44                                r[1]=StringTools.urlDecode(r[1]);
45                                params.set(r[0],r[1]);
46                                trace(r[0] + " -> "+ r[1]);
47                        }
48                       
49                        req.method=method;
50                        req.path=path;
51                        req.params=params;
52                       
53                        var res=new Response();                 
54                        res.setHeader("Content-Type","text/html");
55                        res.setHeader("Connection","close");
56                        res.status="200 OK";
57                        handler(req,res);
58                       
59                        res.setHeader("Content-Length",""+res.buf.length);
60                       
61                        trace(method+" - "+path+" - "+req);
62                       
63                        c.write("HTTP/1.1 "+res.status+"\n");
64                        var k:String;
65                        for (k in res.headerKeys()) {
66                           c.write(k+": "+res.getHeader(k)+"\n");
67                        }
68            //c.write("Content-Length: "+res.buf.length+"\n");
69                        //c.write("Content-Type: text/html; charset=utf-8\n");
70                        //c.write("Connection: close\n");
71                        c.write("\n");
72                        c.write(res.buf);
73            c.close();
74        }
75   
76   }
77}
Note: See TracBrowser for help on using the browser.