node-http-server – Diff between revs 37 and 38

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 37 Rev 38
1 #!/usr/bin/env node 1 #!/usr/bin/env node
2   2  
3 /*************************************************************************/ 3 /*************************************************************************/
4 /* Copyright (C) 2017 Wizardry and Steamworks - License: GNU GPLv3 */ 4 /* Copyright (C) 2017 Wizardry and Steamworks - License: GNU GPLv3 */
5 /*************************************************************************/ 5 /*************************************************************************/
6   6  
7 // Import packages. 7 // Import packages.
8 const https = require('https'); 8 const https = require('https')
9 const http = require('http'); 9 const http = require('http')
10 const path = require('path'); 10 const path = require('path')
11 const fs = require('fs'); 11 const fs = require('fs')
12 const url = require('url'); 12 const url = require('url')
13 const moment = require('moment'); 13 const moment = require('moment')
14 const winston = require('winston'); 14 const winston = require('winston')
15 const yargs = require('yargs'); 15 const yargs = require('yargs')
16 const dns = require('dns'); 16 const dns = require('dns')
17 const HttpCache = require("http-cache"); 17 const HttpCache = require("http-cache")
18   18  
19 // Local imports. 19 // Local imports.
20 const Handler = require( 20 const Handler = require(
21 path 21 path
22 .resolve( 22 .resolve(
23 path.dirname(require.main.filename), 23 path.dirname(require.main.filename),
24 'src', 24 'src',
25 'handler' 25 'handler'
26 ) 26 )
27 ); 27 )
-   28  
28 const certs = require( 29 const certs = require(
29 path 30 path
30 .resolve( 31 .resolve(
31 path.dirname(require.main.filename), 32 path.dirname(require.main.filename),
32 'src', 33 'src',
33 'certs' 34 'certs'
34 ) 35 )
35 ); 36 )
36   37  
37 // Load configuration file. 38 // Load configuration file.
38 const config = require( 39 const config = require(
39 path 40 path
40 .resolve( 41 .resolve(
41 path.dirname(require.main.filename), 42 path.dirname(require.main.filename),
42 'config' 43 'config'
43 ) 44 )
44 ); 45 )
45   46  
46 // Get command-line arguments. 47 // Get command-line arguments.
47 const argv = yargs 48 const argv = yargs
48 .version() 49 .version()
49 .option('root', { 50 .option('root', {
50 alias: 'd', 51 alias: 'd',
51 describe: 'Path to the document root', 52 describe: 'Path to the document root',
52 demandOption: true 53 demandOption: true
53 }) 54 })
54 .help() 55 .help()
55 .argv 56 .argv
56   57  
57 // Create various logging mechanisms. 58 // Create various logging mechanisms.
58 // RFC5424 - { emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 } 59 // RFC5424 - { emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 }
59 winston.setLevels(winston.config.syslog.levels); 60 winston.setLevels(winston.config.syslog.levels)
60 const log = new winston.Logger({ 61 const log = new winston.Logger({
61 transports: [ 62 transports: [
62 new winston.transports.File({ 63 new winston.transports.File({
63 level: 'info', 64 level: 'info',
64 filename: path.resolve( 65 filename: path.resolve(
65 path.dirname(require.main.filename), 66 path.dirname(require.main.filename),
66 config.log.file 67 config.log.file
67 ), 68 ),
68 handleExceptions: true, 69 handleExceptions: true,
69 json: false, 70 json: false,
70 maxsize: 1048576, // 1MiB. 71 maxsize: 1048576, // 1MiB.
71 maxFiles: 10, // Ten rotations. 72 maxFiles: 10, // Ten rotations.
72 colorize: false, 73 colorize: false,
73 timestamp: () => moment() 74 timestamp: () => moment()
74 .format('YYYYMMDDTHHmmss') 75 .format('YYYYMMDDTHHmmss')
75 }), 76 }),
76 new winston.transports.Console({ 77 new winston.transports.Console({
77 level: 'info', 78 level: 'info',
78 handleExceptions: true, 79 handleExceptions: true,
79 json: false, 80 json: false,
80 colorize: true, 81 colorize: true,
81 timestamp: () => moment() 82 timestamp: () => moment()
82 .format('YYYYMMDDTHHmmss') 83 .format('YYYYMMDDTHHmmss')
83 }) 84 })
84 ], 85 ],
85 exitOnError: false 86 exitOnError: false
86 }); 87 })
87   88  
88 fs.realpath(argv.root, (error, root) => { 89 fs.realpath(argv.root, (error, root) => {
89 if (error) { 90 if (error) {
90 log.error('Could not find document root: ' + argv.root); 91 log.error('Could not find document root: ' + argv.root)
91 process.exit(1); 92 process.exit(1)
92 } 93 }
93   94  
94 // Create server-side cache. 95 // Create server-side cache.
95 const httpcache = new HttpCache(); 96 const httpcache = new HttpCache()
96   97  
97 // Start HTTP server. 98 // Start HTTP server.
98 http.createServer( 99 http.createServer(
99 // authentication, 100 // authentication,
100 (request, response) => { 101 (request, response) => {
101 // Configuration path requested, so send the server configuration if allowed. 102 // Configuration path requested, so send the server configuration if allowed.
102 if(config.configuration.enable === true && 103 if (config.configuration.enable === true &&
103 url.parse(request.url, true).path === 104 url.parse(request.url, true).path ===
104 config.configuration.path) { 105 config.configuration.path) {
105 const address = request.socket.address(); 106 const address = request.socket.address()
106 log.info('HTTP Server configuration requested by: ' + 107 log.info('HTTP Server configuration requested by: ' +
107 address.address + ':' + 108 address.address + ':' +
108 address.port 109 address.port
109 ); 110 )
110 response.setHeader('Content-Type', 'application/json'); 111 response.setHeader('Content-Type', 'application/json')
111 response.end(JSON.stringify(config)); 112 response.end(JSON.stringify(config))
112 return; 113 return
113 } 114 }
114 115  
115 // Process and cache the resource. 116 // Process and cache the resource.
116 httpcache(request, response, () => { 117 httpcache(request, response, () => {
117 new Handler().process(config, request, response, root) 118 new Handler().process(config, request, response, root)
118 .on('log', (data) => { 119 .on('log', (data) => {
119 log.log(data.severity, data.message); 120 log.log(data.severity, data.message)
120 }) 121 })
121 .on('data', (result) => { 122 .on('data', (result) => {
122 response.setHeader('Content-Type', result.type); 123 response.setHeader('Content-Type', result.type)
123 response.writeHead(result.status); 124 response.writeHead(result.status)
124 result.data 125 result.data.pipe(response)
125 .on('readable', () => result.data.pipe(response)) -  
126 .on('end', () => response.end()); -  
127 }); 126 })
128 }); 127 })
129 } 128 }
130 ).listen(config.net.port, config.net.address, () => { 129 ).listen(config.net.port, config.net.address, () => {
131 log.info('HTTP Server accessible at: http://' + 130 log.info('HTTP Server accessible at: http://' +
132 config.net.address + 131 config.net.address +
133 ':' + 132 ':' +
134 config.net.port + 133 config.net.port +
135 ' and serving files from directory: ' + 134 ' and serving files from directory: ' +
136 root 135 root
137 ); 136 )
138 }); 137 })
139   138  
140 // Start HTTPs server if enabled. 139 // Start HTTPs server if enabled.
141 if (config.ssl.enable) { 140 if (config.ssl.enable) {
142 // Generate certificates for HTTPs. 141 // Generate certificates for HTTPs.
143 certs.generate( 142 certs.generate(
144 config.site.name, 143 config.site.name,
145 config.net.address, 144 config.net.address,
146 config.ssl.privateKeySize, 145 config.ssl.privateKeySize,
147 (certificates) => { 146 (certificates) => {
148 https.createServer( 147 https.createServer(
149 // authentication, 148 // authentication,
150 { 149 {
151 key: certificates.privateKey, 150 key: certificates.privateKey,
152 cert: certificates.certificate, 151 cert: certificates.certificate,
153 }, 152 },
154 (request, response) => { 153 (request, response) => {
155 154  
156 // Configuration path requested, so send the server configuration if allowed. 155 // Configuration path requested, so send the server configuration if allowed.
157 if(config.configuration.enable === true && 156 if (config.configuration.enable === true &&
158 url.parse(request.url, true).path === 157 url.parse(request.url, true).path ===
159 config.configuration.path) { 158 config.configuration.path) {
160 const address = request.socket.address(); 159 const address = request.socket.address()
161 log.info('HTTP Server configuration requested by: ' + 160 log.info('HTTP Server configuration requested by: ' +
162 address.address + ':' + 161 address.address + ':' +
163 address.port 162 address.port
164 ); 163 )
165 response.setHeader('Content-Type', 'application/json'); 164 response.setHeader('Content-Type', 'application/json')
166 response.end(JSON.stringify(config)); 165 response.end(JSON.stringify(config))
167 return; 166 return
168 } 167 }
169 168  
170 httpcache(request, response, () => { 169 httpcache(request, response, () => {
171 new Handler().process(config, request, response, root) 170 new Handler().process(config, request, response, root)
172 .on('log', (data) => { 171 .on('log', (data) => {
173 log.log(data.severity, data.message); 172 log.log(data.severity, data.message)
174 }) 173 })
175 .on('data', (result) => { 174 .on('data', (result) => {
176 response.setHeader('Content-Type', result.type); 175 response.setHeader('Content-Type', result.type)
177 response.writeHead(result.status); 176 response.writeHead(result.status)
178 result.data 177 result.data.pipe(response)
179 .on('readable', () => result.data.pipe(response)) -  
180 .on('end', () => response.end()); -  
181 }); 178 })
182 }); 179 })
183 } 180 }
184 ).listen(config.ssl.port, config.ssl.address, () => { 181 ).listen(config.ssl.port, config.ssl.address, () => {
185 log.info('HTTPs Server accessible at: https://' + 182 log.info('HTTPs Server accessible at: https://' +
186 config.ssl.address + 183 config.ssl.address +
187 ':' + 184 ':' +
188 config.ssl.port + 185 config.ssl.port +
189 ' and serving files from directory: ' + 186 ' and serving files from directory: ' +
190 root 187 root
191 ); 188 )
192 }) 189 })
193 } 190 }
194 ); 191 )
195 } 192 }
196 }); 193 })
197   194