JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
9beb901339f9af8fd2fcd70322669aac0b603e92
[peach-cgt.git] / server.coffee
1 listen_port = 8333
2 sys = require 'sys'
3 fs = require 'fs'
4 http = require 'http'
5 url = require 'url'
6 less = require 'less'
7 coffee = require 'coffee-script'
8
9 css_handler = (args, out, request, url_parts) ->
10         fs.readFile 'style.less', 'utf8', (err, data) ->
11                 if err
12                         return out.end 'Server failed to read style.less'
13                 less.render data, (err, css) ->
14                         if err
15                                 return out.end "Server failed to make css: #{err}"
16                         out.end css
17
18 js_handler = (args, out, request, url_parts) ->
19         basename = url_parts.pathname.substr 1, (url_parts.pathname.length - 4)
20         if basename is 'client'
21                 filename = 'client.coffee'
22         else if basename is 'common'
23                 filename = 'common.coffee'
24         else
25                 error = "Unknown js basename: #{basename}"
26                 console.log error
27                 out.end(error)
28                 return
29
30         fs.readFile filename, 'utf8', (err, data) ->
31                 if err
32                         return out.end "Server failed to read #{filename}"
33                 out.end coffee.compile data
34
35 html_handler = (args, out, request, url_parts) ->
36         fs.readFile 'index.html', 'utf8', (err, data) ->
37                 if err
38                         return out.end 'Server failed to read index.html'
39                 out.end data
40
41 clean_pathname_regex = new RegExp('[^a-zA-Z/_.-]')
42 clean_pathname_regex2 = new RegExp('/[.]')
43 clean_pathname_regex3 = new RegExp('^[.-]')
44 clean_pathname = (str) ->
45         str = str.replace clean_pathname_regex, '_'
46         str = str.replace clean_pathname_regex2, '/_'
47         return str.replace clean_pathname_regex3, '_'
48
49 # serve javascript files from within /usr/share/javascript
50 javascript_handler = (args, out, request, url_parts) ->
51         filename = clean_pathname "/usr/share/#{url_parts.pathname}"
52         fs.readFile filename, 'utf8', (err, data) ->
53                 if err
54                         out.writeHead 404
55                         return out.end "Server failed to read #{filename}"
56                 out.writeHead 200, 'Content-Type': 'text/javascript'
57                 out.end data
58
59
60 http_server = http.createServer (req, res) ->
61         url_parts = url.parse req.url, true
62         if url_parts.query is undefined
63                 url_parts.query = {}
64
65         rel_path = url_parts.pathname.substr 1
66
67         if rel_path.substr(0, 11) is 'javascript/'
68                 return javascript_handler url_parts.query, res, req, url_parts
69         else if rel_path.substr(rel_path.length - 4) is '.css'
70                 res.writeHead 200, 'Content-Type': 'text/css'
71                 return css_handler url_parts.query, res, req, url_parts
72         else if rel_path.substr rel_path.length - 3 is '.js'
73                 res.writeHead 200, 'Content-Type': 'text/javascript'
74                 return js_handler url_parts.query, res, req, url_parts
75
76         return html_handler url_parts.query, res, req, url_parts
77
78 http_server.listen listen_port, "127.0.0.1"
79 console.log "Server running at http://127.0.0.1:#{listen_port}/"