functional
[nodejsws.git] / lib / wsrequest.js
1 var url = require("url");
2 var path = require("path");
3 var fs = require("fs");
4 //var myparse = require("./myparse.js");
5 var webmain = require("./webmain.js");
6 var layouts = require("./layouts.js");
7
8 // global stuff
9 var extraCss = new Array();
10 var extraJs = new Array();
11 //var defaultLayout = null;
12 var defaultMainPurl = null;
13
14 //var staticExtensions = ["html", "gif", "jpg", "css", "js", "ico"];
15
16 function wsRequest(request, response) {
17         var isStatic = 0;
18         var purl = url.parse(request.url);
19         
20         /*staticExtensions.forEach(function testExtn(setest) {
21                 console.log("testing url: ", request.url);
22                 console.log("against: ", purl.pathname);
23                 var chk = purl.pathname.split(".");
24                 console.log("chk: ", chk);
25                 var chkid = staticExtensions.indexOf(chk[chk.length-1].toLowerCase());
26                 console.log("chkid is ", chkid);
27                 if(chkid != -1) {
28                         isStatic = 1;
29                 }
30         });*/
31         
32         // if the end of the pathname is something.something, we assume static
33         var lpath = purl.pathname.split("/").pop();
34         var idx = lpath.indexOf(".");
35         console.log("testing url: ", request.url);
36         console.log("against: ", purl.pathname);
37         console.log("lpath is: '%s'", lpath);
38         console.log("type is: '%s'", typeof lpath);
39         console.log("idx is: ", idx);
40         
41         if(idx > 0) isStatic = 1;
42         
43         if(isStatic == 1) {
44                 // do the static
45                 console.log("Service as static");
46                 serveStatic(lpath, response);
47                 return;
48         }
49         
50         //console.log("request: ", request);
51         console.log("purl: ", purl);
52
53         // now we need to find the extension used
54         // to serve the request based no the first purl
55         
56         
57         /*
58          * 
59         if(purl.pathname == "/") {
60                 console.log("Serv main");
61                 webmain.serveMain(request, response, function (request, response) {
62                         response.end();
63                 });
64                 return;
65         }
66
67         var thispurl = purl.pathname.split("/")[1];
68         fs.stat("./purls/web_"+thispurl+".js", function (err, stats) {
69                 console.log("get purl is "+thispurl+" and err "+err+" and "+stats);
70                 if(err) {
71                         response.writeHead(404, {"Content-Type": "text/plain"});
72                         response.write("404 Not Found\n");
73                         response.end();
74                         return;
75                 }
76                 var thiserv = require("../purls/web_"+thispurl+".js");
77                 if(thiserv.requireBody()) {
78                         console.log("yubber is true");
79                         webmain.serveBody(request, response, thiserv.process);
80                 } else {
81                         console.log("yubber is false");
82                         thiserv.process(request, response, function(request, response) {
83                                 response.end();
84                         });
85                 }
86                 return;
87         });
88         */
89         
90         urlServicer(request, response, purl);
91         
92         
93         return;
94 }
95
96 function urlServicer(request, response, purl) {
97         console.log("url servicer called for ", purl);
98         
99         // first resolve the module making the call and determine layout/purl
100         var purlClass = layouts;
101         var purlLayout = layouts.standard();
102         var mainPath = path.dirname(require.main.filename) + "/purls/";
103
104         console.log("main purl path is ", mainPath);
105         
106         if(purl.pathname == "/") {
107                 if(defaultMainPurl == null) {
108                         console.log("set purl class to layouts");
109                         purlClass = layouts;
110                 } else {
111                         // find and load the purl
112                 }
113                 
114         } else {
115                 // handle the purls
116                 var newPurlPath = mainPath+"/"+path.basename(purl.pathname.replace(/\/$/, ""))+".js";
117                 console.log("attempting to require: ", newPurlPath);
118                 try {
119                         var newPurlClass = require(newPurlPath);
120                         purlClass = newPurlClass;
121                 } catch(err) {
122                         console.log("tried to load '%s' for request '%s', but this has failed, returning 302 to /", newPurlPath, purl.pathname);
123                         response.writeHead("302", { 'Location': '/' });
124                         response.end();
125                         return;
126                 }
127
128         }
129
130         if(typeof purlClass.layout == "undefined") {
131                 console.log("set via undefined");
132                 purlLayout = layouts.standard();
133         } else {
134                 // find and resolve the layout
135                 purlLayout = purlClass.layout();
136         }
137         
138         // now we should have a layout and a class
139         if(typeof purlClass.preResponse != "undefined") {
140                 purlClass.preResponse(request, response, function() {
141                         serviceLayout(request, response, purlClass, purlLayout);                        
142                 });
143         } else {
144                 serviceLayout(request, response, purlClass, purlLayout);
145         }
146         
147         return;
148 }
149
150 function serviceLayout(request, response, purlClass, purlLayout) {
151         var reallay = "start:"+purlLayout+":end";
152         var splitup = reallay.split("<?njs");
153         var offset=0;
154
155         console.log("inservicer: ", purlLayout);
156         
157         function processLayout() {
158                 var output = "";
159                 
160                 console.log("begin process layout");
161                 
162                 if(offset >= splitup.length) {
163                         //response.write("end of caller");
164                         response.end();
165                         return;
166                 } else if(offset == 0) {
167                         console.log("write for offset 0");
168                         output = splitup[0].replace(/^start:/g, "");
169                         if(splitup.length == 1) output = output.replace(/:end$/g, "");
170                         console.log("did write: ", output);
171                         response.write(output);
172                         offset++;
173                         processLayout();
174                 } else {
175                         var thispart = splitup[offset].split("?>");
176                         var caller = thispart[0].trim();
177                         
178                         console.log("in parts for bits: ", thispart);
179                         console.log("and caller is: ", caller);
180                         
181                         // here we resolve and call the caller....
182                         //response.write("calling: " + caller);
183                         resolveAndCall(request, response, caller, purlClass, function () {
184                                 output = thispart[1].replace(/:end$/g, "");
185                                 response.write(output);
186                                 offset++;
187                                 processLayout();
188                         });
189                 }
190         }
191         
192         processLayout();
193         
194         //response.write("servicer");
195         //response.end();
196 }
197
198 function resolveAndCall(request, response, caller, purlClass, callback) {
199         //response.write("resolving: \"" + caller + "\"");
200         
201         // TODO: do this properly.
202         if(typeof purlClass[caller] != "undefined") {
203                 purlClass[caller](request, response, callback);
204         } else if(typeof layouts[caller] != "undefined"){
205                 layouts[caller](request, response, callback);
206         } else {
207                 response.write("<!-- ERROR:Undefined layout section -->");
208                 callback();
209         }
210         //callback();
211         return;
212 }
213
214 function serveStatic(staticname, response) {
215         var pathName = "./res/"+staticname;
216         console.log("Pathname for check is ", pathName);
217         fs.exists(pathName, function(exists) {
218                 if(!exists) {
219                         response.writeHead(404, {"Content-Type": "text/plain"});
220                         response.write("404 Not Found\n");
221                         response.end();
222                         return;
223                 }
224                 
225                 fs.readFile(pathName, "binary", function(err, file) {
226                         if(err) {        
227                                 response.writeHead(500, {"Content-Type": "text/plain"});
228                                 response.write(err + "\n");
229                                 response.end();
230                                 return;
231                         }
232
233                         response.writeHead(200);
234                         response.write(file, "binary");
235                         response.end();                 
236                 });
237         });
238 }
239
240 exports.wsRequest = wsRequest;