semi-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         
103         if(purl.pathname == "/") {
104                 if(defaultMainPurl == null) {
105                         console.log("set purl class to layouts");
106                         purlClass = layouts;
107                 } else {
108                         // find and load the purl
109                 }
110                 
111                 if(typeof purlClass.layout == "undefined") {
112                         console.log("set via undefined");
113                         purlLayout = layouts.standard();
114                 } else {
115                         // find and resolve the layout
116                 }
117         } else {
118                 // handle the purls
119         }
120         
121         // now we should have a layout and a class
122         if(typeof purlClass.preResponse != "undefined") {
123                 purlClass.preResponse(request, response, function() {
124                         serviceLayout(request, response, purlClass, purlLayout);                        
125                 });
126         } else {
127                 serviceLayout(request, response, purlClass, purlLayout);
128         }
129         
130         return;
131 }
132
133 function serviceLayout(request, response, purlClass, purlLayout) {
134         var reallay = "start:"+purlLayout+":end";
135         var splitup = reallay.split("<?njs");
136         var offset=0;
137
138         console.log("inservicer: ", purlLayout);
139         
140         function processLayout() {
141                 var output = "";
142                 
143                 console.log("begin process layout");
144                 
145                 if(offset >= splitup.length) {
146                         response.write("end of caller");
147                         response.end();
148                         return;
149                 } else if(offset == 0) {
150                         console.log("write for offset 0");
151                         output = splitup[0].replace(/^start:/g, "");
152                         if(splitup.length == 1) output = output.replace(/:end$/g, "");
153                         console.log("did write: ", output);
154                         response.write(output);
155                         offset++;
156                         processLayout();
157                 } else {
158                         var thispart = splitup[offset].split("?>");
159                         var caller = thispart[0].trim();
160                         
161                         console.log("in parts for bits: ", thispart);
162                         console.log("and caller is: ", caller);
163                         
164                         // here we resolve and call the caller....
165                         //response.write("calling: " + caller);
166                         resolveAndCall(request, response, caller, purlClass, function () {
167                                 output = thispart[1].replace(/:end$/g, "");
168                                 response.write(output);
169                                 offset++;
170                                 processLayout();
171                         });
172                 }
173         }
174         
175         processLayout();
176         
177         //response.write("servicer");
178         //response.end();
179 }
180
181 function resolveAndCall(request, response, caller, purlClass, callback) {
182         //response.write("resolving: \"" + caller + "\"");
183         if(typeof purlClass[caller] != "undefined") {
184                 purlClass[caller](request, response, callback);
185         } else if(typeof purlClass[caller] != "undefined"){
186                 layouts[caller](request, response, callback);
187         } else {
188                 response.write("<hr><br>Undefined layout section<br><hr>");
189                 callback();
190         }
191         //callback();
192         return;
193 }
194
195 function serveStatic(staticname, response) {
196         var pathName = "./res/"+staticname;
197         console.log("Pathname for check is ", pathName);
198         fs.exists(pathName, function(exists) {
199                 if(!exists) {
200                         response.writeHead(404, {"Content-Type": "text/plain"});
201                         response.write("404 Not Found\n");
202                         response.end();
203                         return;
204                 }
205                 
206                 fs.readFile(pathName, "binary", function(err, file) {
207                         if(err) {        
208                                 response.writeHead(500, {"Content-Type": "text/plain"});
209                                 response.write(err + "\n");
210                                 response.end();
211                                 return;
212                         }
213
214                         response.writeHead(200);
215                         response.write(file, "binary");
216                         response.end();                 
217                 });
218         });
219 }
220
221 exports.wsRequest = wsRequest;