aboutsummaryrefslogtreecommitdiff
path: root/bin/www
blob: 1c08756307753b2e9604d51af9fd1b4f6e2c08a1 (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
#!/usr/bin/env node

const fs = require('fs')
const app = require('../app')
const http = require('http')
const https = require('spdy')

const fileLocations = {
  cert: '/etc/letsencrypt/live/rooster.hetmml.nl/fullchain.pem',
  privkey: '/etc/letsencrypt/live/rooster.hetmml.nl/privkey.pem'
}

function setupHTTPS () {
  const certificate = fs.readFileSync(fileLocations.cert, 'utf8')
  const privateKey = fs.readFileSync(fileLocations.privkey, 'utf8')
  const credentials = { key: privateKey, cert: certificate }

  const httpsPort = normalizePort(process.env.PORT_HTTPS || '3001')
  const httpsServer = https.createServer(credentials, app)

  httpsServer.listen(httpsPort)
  httpsServer.on('error', error => onError(error, httpsPort))
  httpsServer.on('listening', _ => onListening(httpsServer))

  app.set('port', httpsPort)
}

function setupHTTPSRedirect () {
  const httpPort = normalizePort(process.env.PORT || '3000')
  const httpServer = http.createServer(redirectToHTTPS)

  httpServer.listen(httpPort)
  httpServer.on('error', error => onError(error, httpPort))
  httpServer.on('listening', _ => onListening(httpServer))
}

function setupHTTP () {
  const httpPort = normalizePort(process.env.PORT || '3000')
  const httpServer = http.createServer(app)

  httpServer.listen(httpPort)
  httpServer.on('error', error => onError(error, httpPort))
  httpServer.on('listening', _ => onListening(httpServer))
}

function normalizePort (val) {
  const port = parseInt(val, 10)

  if (isNaN(port)) {
    // named pipe
    return val
  }

  if (port >= 0) {
    // port number
    return port
  }

  return false
}

function onError (error, port) {
  if (error.syscall !== 'listen') {
    throw error
  }

  const bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges')
      process.exit(1)
      break
    case 'EADDRINUSE':
      console.error(bind + ' is already in use')
      process.exit(1)
      break
    default:
      throw error
  }
}

function onListening (server) {
  const addr = server.address()
  const bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port
  console.log('Listening on ' + bind)
}

let useHTTPS = true
try {
  fs.accessSync(fileLocations.privkey)
} catch (e) {
  useHTTPS = false
}

if (useHTTPS) {
  try {
    setupHTTPS()
    setupHTTPSRedirect()
  } catch (e) {
    console.warn('NOT USING HTTPS! Error occured while setting up HTTPS')
    setupHTTP()
  }
} else {
  console.warn(`NOT USING HTTPS! Could not read ${fileLocations.privkey}`)
  setupHTTP()
}

function redirectToHTTPS (req, res) {
  res.writeHead(302, { 'Location': 'https://' + req.headers['host'] + req.url })
  res.end()
}