summaryrefslogtreecommitdiff
path: root/server/http/http.js
blob: 1fa985d767d749ff8cbbc18b6f5f53ebde5edb48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var http = require('http'),
    url = require('url'),
    path = require('path'),
    fs = require('fs'),
    Config = require('../../config/http.js'),
    conf = new Config();
    
http.createServer(
    requestRecieved
).listen(conf.port);

function serveFile(filename,exists,response) {
    if(!exists) {
        serve(
            response,
            '404 MIA',
            404
        );
        return;
    }
    
    var contentType = path.extname(filename).slice(1);
    
    //Only serve specified file types 
    if(!conf.contentType){
        serve(
            response,
            '415 File type not supported',
            415
        );
        return;
    }
    
    //Deny restricted file types 
    if(!conf.contentType[contentType]){
        serve(
            response,
            '415 File type not supported',
            415
        );
        return;
    }
    
    //Do not allow access to Dirs or restricted file types
    if (
        fs.statSync(filename).isDirectory() ||
        conf.restrictedType[contentType]
    ){
        serve(
            response,
            '403 Access Denied',
            403
        );
        return;
    }
    
    fs.readFile(
        filename, 
        'binary', 
        function(err, file) {
            if(err) {        
                serve(
                    response,
                    '500 '+err,
                    500
                );
                return;
            }
    
            var headers = {
                'Content-Type' : conf.contentType[contentType]
            }
            serve(
                response,
                file,
                200,
                headers,
                'binary'
            );
            return;
        }
    );
}

function serve(response,body,status,headers,encoding){
    //defaults to 200
    if(!status)
        status=200;
    
    //defaults to text/plain
    if(!headers)
        headers={
            'Content-type':'text/plain'
        }
    
   //defaults to utf8
    if(!encoding)
        encoding='utf8';
    
    response.writeHead(
        status, 
        headers
    );
    response.write(body,encoding);
    response.end();
    return;
}

function requestRecieved(request,response){
    var uri = url.parse(request.url).pathname;
    if (uri=='/')
        uri='/'+conf.server.index;
    
    var filename = path.join(
        conf.rootDIR, 
        uri
    );
    
    fs.exists(
        filename,
        function(exists){
            serveFile(filename,exists,response)
        }
    );
}