1 var url
= require('url'),
3 node_static
= require('node-static'),
8 var HttpHandler = function (config
) {
9 var public_html
= config
.public_html
|| 'client/';
10 this.file_server
= new node_static
.Server(public_html
);
13 module
.exports
.HttpHandler
= HttpHandler
;
17 HttpHandler
.prototype.serve = function (request
, response
) {
18 // The incoming requests base path (ie. /kiwiclient)
19 var base_path
= global
.config
.http_base_path
|| '/kiwi',
22 // Trim of any trailing slashes
23 if (base_path
.substr(base_path
.length
- 1) === '/') {
24 base_path
= base_path
.substr(0, base_path
.length
- 1);
27 // Build the regex to match the base_path
28 base_path_regex
= base_path
.replace(/[-/\\^$*+?.()|[\]{}]/g
, '\\$&');
30 // Any asset request to head into the asset dir
31 request
.url
= request
.url
.replace(base_path
+ '/assets/', '/assets/');
33 // Any requests for /client to load the index file
34 if (request
.url
.match(new RegExp('^' + base_path_regex
+ '([/$]|$)', 'i'))) {
38 // If the 'magic' translation is requested, figure out the best language to use from
39 // the Accept-Language HTTP header. If nothing is suitible, fallback to our en-gb default translation
40 if (request
.url
.substr(0, 16) === '/assets/locales/') {
41 if (request
.url
=== '/assets/locales/magic.json') {
42 return serveMagicLocale
.call(this, request
, response
);
44 response
.setHeader('Content-Language', request
.url
.substr(16, request
.url
.indexOf('.') - 16));
48 this.file_server
.serve(request
, response
, function (err
) {
50 response
.writeHead(err
.status
, err
.headers
);
56 var serveMagicLocale = function (request
, response
) {
58 if (request
.headers
['accept-language']) {
59 fs
.readdir('client/assets/locales', function (err
, files
) {
62 langs
= request
.headers
['accept-language'].split(','); // Example: en-gb,en;q=0.5
64 files
.forEach(function (file
) {
65 if (file
.substr(-5) === '.json') {
66 available
.push(file
.slice(0, -5));
70 for (i
= 0; i
< langs
.length
; i
++) {
71 langs
[i
]= langs
[i
].split(';q=');
72 langs
[i
][1] = (typeof langs
[i
][1] === 'string') ? parseFloat(langs
[i
][1]) : 1.0;
74 langs
.sort(function (a
, b
) {
77 for (i
= 0; i
< langs
.length
; i
++) {
78 langs
[i
][0] = langs
[i
][0].toLowerCase();
79 if (langs
[i
][0] === '*') {
81 } else if (_
.contains(available
, langs
[i
][0])) {
82 return that
.file_server
.serveFile('/assets/locales/' + langs
[i
][0] + '.json', 200, {Vary
: 'Accept-Language', 'Content-Language': langs
[i
][0]}, request
, response
);
85 serveFallbackLocale
.call(this, request
, response
);
88 serveFallbackLocale
.call(this, request
, response
);
92 var serveFallbackLocale = function (request
, response
) {
93 //en-gb is our default language, so we serve this as the last possible answer for everything
94 this.file_server
.serveFile('/assets/locales/en-gb.json', 200, {Vary
: 'Accept-Language', 'Content-Language': 'en-gb'}, request
, response
);