Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core, cli): builtin support of https and unix sockets #3831

Merged
merged 33 commits into from Sep 2, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
18e9ed4
add https capabilities to dev server by adding `https` in nuxt config.
Jun 1, 2018
45f4150
fix(package.json): upgrade vue-loader from 13.7.0 to ^13.7.2 for pret…
Jun 6, 2018
5b7e27a
chore(release): upgrade nuxt from 1.4.0 to 1.4.1
Jun 6, 2018
53db419
Merge branch 'dev' into 146-enable-https-for-dev
Atinux Aug 1, 2018
90bd6c3
fix: upgrade vue for fixing ssr vulnerability
clarkdo Aug 1, 2018
376dd35
1.4.2
Atinux Aug 1, 2018
8828878
Add options in CLI to enable UNIX sockets
Xowap Aug 28, 2018
d425f8a
fix: conflicts
galvez Sep 1, 2018
c35e956
Fix flag
galvez Sep 1, 2018
3d4931a
unix -> socket in getLatestHost
galvez Sep 1, 2018
8e7fbda
missing socket param
galvez Sep 1, 2018
80e7fa2
unix->socket
galvez Sep 1, 2018
25b6042
unix->socket (2)
galvez Sep 1, 2018
53e16f9
lint
galvez Sep 1, 2018
2f6e4a3
fix: https conflicts
galvez Sep 1, 2018
54ee545
missing appServer def
galvez Sep 1, 2018
9e2c360
lint
galvez Sep 1, 2018
2d34211
Move options to server.https, patch nuxt-dev
galvez Sep 1, 2018
4d151b1
Patch nuxt-dev (2)
galvez Sep 1, 2018
b51b9a6
lint
galvez Sep 1, 2018
27d6ad6
Added self-signed fixture certs
galvez Sep 1, 2018
25b4be4
Add https/nuxt.config.js
galvez Sep 1, 2018
e736d62
Fix args
galvez Sep 1, 2018
70b979b
Added https/sockets fixtures
galvez Sep 1, 2018
af951e3
Pickup socket from server.socket if defined
galvez Sep 2, 2018
08e378b
Add https/sockets unit tests
galvez Sep 2, 2018
3a70ea5
lint
galvez Sep 2, 2018
2c08d13
lint
galvez Sep 2, 2018
0ddafeb
Skip sockets test in appveyor
galvez Sep 2, 2018
39d7e4a
Merge branch 'dev' into sockets-and-https
pi0 Sep 2, 2018
25718f9
add missing NUXT_* env vars
galvez Sep 2, 2018
7e6122f
Merge branch 'sockets-and-https' of github.com:nuxt/nuxt.js into sock…
galvez Sep 2, 2018
9423fcc
Merge branch 'dev' into sockets-and-https
pi0 Sep 2, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 19 additions & 0 deletions bin/common/utils.js
Expand Up @@ -52,3 +52,22 @@ exports.loadNuxtConfig = (argv) => {

return options
}

exports.getLatestHost = (argv) => {
const port =
argv.port ||
process.env.NUXT_PORT ||
process.env.PORT ||
process.env.npm_package_config_nuxt_port
const host =
argv.hostname ||
process.env.NUXT_HOST ||
process.env.HOST ||
process.env.npm_package_config_nuxt_host
const socket =
argv['unix-socket'] ||
process.env.UNIX_SOCKET ||
process.env.npm_package_config_unix_socket

return { port, host, socket }
}
6 changes: 3 additions & 3 deletions bin/nuxt-dev
Expand Up @@ -3,7 +3,7 @@ const parseArgs = require('minimist')
const consola = require('consola')
const { version } = require('../package.json')
const { Nuxt, Builder } = require('..')
const { loadNuxtConfig } = require('./common/utils')
const { loadNuxtConfig, getLatestHost } = require('./common/utils')

const argv = parseArgs(process.argv.slice(2), {
alias: {
Expand Down Expand Up @@ -75,7 +75,7 @@ const errorHandler = (err, instance) => {
}

// Get latest environment variables
const { port, host } = nuxt.options.server
const { port, host, socket } = getLatestHost(argv)

return (
Promise.resolve()
Expand All @@ -91,7 +91,7 @@ const errorHandler = (err, instance) => {
})
.then(() => oldInstance && oldInstance.nuxt.close())
// Start listening
.then(() => nuxt.listen(port, host))
.then(() => nuxt.listen(port, host, socket))
// Show ready message first time, others will be shown through WebpackBar
.then(() => !oldInstance && nuxt.showReady(false))
.then(() => builder.watchServer())
Expand Down
10 changes: 6 additions & 4 deletions bin/nuxt-start
Expand Up @@ -4,19 +4,20 @@ const { resolve } = require('path')
const parseArgs = require('minimist')
const consola = require('consola')
const { Nuxt } = require('../dist/nuxt-start')
const { loadNuxtConfig } = require('./common/utils')
const { loadNuxtConfig, getLatestHost } = require('./common/utils')

const argv = parseArgs(process.argv.slice(2), {
alias: {
h: 'help',
H: 'hostname',
p: 'port',
n: 'unix-socket',
c: 'config-file',
s: 'spa',
u: 'universal'
},
boolean: ['h', 's', 'u'],
string: ['H', 'c'],
string: ['H', 'c', 'n'],
default: {
c: 'nuxt.config.js'
}
Expand All @@ -36,6 +37,7 @@ if (argv.help) {
Options
--port, -p A port number on which to start the application
--hostname, -H Hostname on which to start the application
--unix-socket, -n Path to a UNIX socket
--spa Launch in SPA mode
--universal Launch in Universal mode (default)
--config-file, -c Path to Nuxt.js config file (default: nuxt.config.js)
Expand Down Expand Up @@ -77,8 +79,8 @@ if (nuxt.options.render.ssr === true) {
}
}

const { port, host } = nuxt.options.server
const { port, host, socket } = getLatestHost(argv)
Copy link
Member

@pi0 pi0 Sep 1, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't we add it to nuxt-dev too?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pi0 good catch.


nuxt.listen(port, host).then(() => {
nuxt.listen(port, host, socket).then(() => {
nuxt.showReady(false)
})
1 change: 1 addition & 0 deletions lib/common/nuxt.config.js
Expand Up @@ -16,6 +16,7 @@ export default {

// Server options
server: {
https: false,
port: process.env.NUXT_PORT ||
process.env.PORT ||
process.env.npm_package_config_nuxt_port,
Expand Down
66 changes: 54 additions & 12 deletions lib/core/nuxt.js
@@ -1,5 +1,6 @@
import Module from 'module'
import { resolve, join } from 'path'
import https from 'https'

import enableDestroy from 'server-destroy'
import _ from 'lodash'
Expand Down Expand Up @@ -141,26 +142,63 @@ export default class Nuxt {
this.readyMessage = null
}

listen(port = 3000, host = 'localhost') {
listen(port = 3000, host = 'localhost', socket = null) {
return this.ready().then(() => new Promise((resolve, reject) => {
const server = this.renderer.app.listen(
{ port, host, exclusive: false },
if (!socket && typeof this.options.server.socket === 'string') {
socket = this.options.server.socket
}

const args = { exclusive: false }

if (socket) {
args.path = socket
} else {
args.port = port
args.host = host
}

let appServer
const isHttps = Boolean(this.options.server.https)

if (isHttps) {
let httpsOptions

if (this.options.server.https === true) {
httpsOptions = {}
} else {
httpsOptions = this.options.server.https
}

appServer = https.createServer(httpsOptions, this.renderer.app)
} else {
appServer = this.renderer.app
}

const server = appServer.listen(
args,
(err) => {
/* istanbul ignore if */
if (err) {
return reject(err)
}

({ address: host, port } = server.address())
if (host === '127.0.0.1') {
host = 'localhost'
} else if (host === '0.0.0.0') {
host = ip.address()
let listenURL

if (!socket) {
({ address: host, port } = server.address())
if (host === '127.0.0.1') {
host = 'localhost'
} else if (host === '0.0.0.0') {
host = ip.address()
}

listenURL = chalk.underline.blue(`http${isHttps ? 's' : ''}://${host}:${port}`)
this.readyMessage = `Listening on ${listenURL}`
} else {
listenURL = chalk.underline.blue(`unix+http://${socket}`)
this.readyMessage = `Listening on ${listenURL}`
}

const listenURL = chalk.underline.blue(`http://${host}:${port}`)
this.readyMessage = `Listening on ${listenURL}`

// Close server on nuxt close
this.hook(
'close',
Expand All @@ -178,7 +216,11 @@ export default class Nuxt {
})
)

this.callHook('listen', server, { port, host }).then(resolve)
if (socket) {
this.callHook('listen', server, { path: socket }).then(resolve)
} else {
this.callHook('listen', server, { port, host }).then(resolve)
}
}
)

Expand Down
3 changes: 3 additions & 0 deletions test/fixtures/https/https.test.js
@@ -0,0 +1,3 @@
import { buildFixture } from '../../utils/build'

buildFixture('https')
11 changes: 11 additions & 0 deletions test/fixtures/https/nuxt.config.js
@@ -0,0 +1,11 @@
import fs from 'fs'
import path from 'path'

export default {
server: {
https: {
key: fs.readFileSync(path.resolve(__dirname, 'server.key')),
cert: fs.readFileSync(path.resolve(__dirname, 'server.crt'))
}
}
}
3 changes: 3 additions & 0 deletions test/fixtures/https/pages/index.vue
@@ -0,0 +1,3 @@
<template>
<h1>Served over HTTPS!</h1>
</template>
19 changes: 19 additions & 0 deletions test/fixtures/https/server.crt
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDIjCCAougAwIBAgIJALww5SutcTujMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
BAYTAkJSMRIwEAYDVQQIEwlTYW8gUGF1bG8xETAPBgNVBAcTCEJhcnJldG9zMQ0w
CwYDVQQKEwROdXh0MREwDwYDVQQLEwhGaXh0dXJlczESMBAGA1UEAxMJbG9jYWxo
b3N0MB4XDTE4MDkwMTIzMTk0OVoXDTE4MTAwMTIzMTk0OVowajELMAkGA1UEBhMC
QlIxEjAQBgNVBAgTCVNhbyBQYXVsbzERMA8GA1UEBxMIQmFycmV0b3MxDTALBgNV
BAoTBE51eHQxETAPBgNVBAsTCEZpeHR1cmVzMRIwEAYDVQQDEwlsb2NhbGhvc3Qw
gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALoFJlquH9KNTPS3E0jbdKWLVw+N
oQaV+yPGPJb/IEAtg2cgMy62UlBS8eMTnMAv6JntuSuqS9wWdrvrTvcJkbbCRnKp
P13OTPpzhXO8R9pgzsopaO0DfLM8mTpFi1UPhzRm5riRCVIcg/KYH5JybI7LVzVu
v6LT3DhOtqp3tufRAgMBAAGjgc8wgcwwHQYDVR0OBBYEFIHCFtBMyB2w+os85zPR
AkI05z4FMIGcBgNVHSMEgZQwgZGAFIHCFtBMyB2w+os85zPRAkI05z4FoW6kbDBq
MQswCQYDVQQGEwJCUjESMBAGA1UECBMJU2FvIFBhdWxvMREwDwYDVQQHEwhCYXJy
ZXRvczENMAsGA1UEChMETnV4dDERMA8GA1UECxMIRml4dHVyZXMxEjAQBgNVBAMT
CWxvY2FsaG9zdIIJALww5SutcTujMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADgYEARaylCmK13yfaARc3utZLmD+vW7P1S4CO25skgaaQasKsKtABTURz92Ju
fShBFvP6d8AQH3yvHEC2+QBUibg6tc9oT1hE1GXYczp11AvYry3hcbalB+V1vqN+
/vMAWDmg5Y0cE/QnJ8YZi2fHFoxkxJdDIfx5/w19vvE5h18IMro=
-----END CERTIFICATE-----
15 changes: 15 additions & 0 deletions test/fixtures/https/server.key
@@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC6BSZarh/SjUz0txNI23Sli1cPjaEGlfsjxjyW/yBALYNnIDMu
tlJQUvHjE5zAL+iZ7bkrqkvcFna76073CZG2wkZyqT9dzkz6c4VzvEfaYM7KKWjt
A3yzPJk6RYtVD4c0Zua4kQlSHIPymB+ScmyOy1c1br+i09w4Traqd7bn0QIDAQAB
AoGAWZpBb0yQZ4tIllfZIi8TcOo9dXBzMAjuf7ztUo5xqnhB41rPTKDl5WsOuKKp
zqlFEWBA4ZeWEt1/M+WUk8o4NU2M03Q5N7cubw2T6/q43pZkCjvdTScsP6sJgGK9
zR0o4+Owu9J5j+X9e7ChfZFVeZa3WCX6dCB17AVfUdCh7EECQQDpPdkLirOsiu5x
/b42+/dLpL4gq+mnAqLzaeHI0Eb2Gt9A8RyxPicdjZGOJ3bmGZPFWcu2xUbmEsic
pSbAmZujAkEAzCvBLokZ2ETJN1pZJgT3luUDmd6LsaW8BJoJ42ECM/k8ARKMJfIS
/tqZPJhdkZ6JhYc36m4lNwPaY7x4Cbxl+wJBAM1WBZ6DnWppZUI1gSAm8q9FeZyJ
vEmrqIlizcNcmRxQy/sASaJAdW8vEtVzKNmp6s3zH8ToKGKkZriBLHyivsECQALF
zVfOcNVpCbqAtZk4lAwui//477i34XfGh7/Yv2jpR5FUKScSxINFgLM79nlVx9RS
Y8YBPOwkV0DnfFHVhyUCQFYYp2B8XgghJGapOcWvp7QogkDWqCra5mrSlI+jzi5W
b1LjJqCCCq4kGK6nKEzT7gd75lb2LbcUdc5JfFHbcE0=
-----END RSA PRIVATE KEY-----
7 changes: 7 additions & 0 deletions test/fixtures/sockets/nuxt.config.js
@@ -0,0 +1,7 @@
import path from 'path'

export default {
server: {
socket: path.resolve(__dirname, 'nuxt.socket')
}
}
3 changes: 3 additions & 0 deletions test/fixtures/sockets/pages/index.vue
@@ -0,0 +1,3 @@
<template>
<h1>Served over sockets!</h1>
</template>
3 changes: 3 additions & 0 deletions test/fixtures/sockets/sockets.test.js
@@ -0,0 +1,3 @@
import { buildFixture } from '../../utils/build'

buildFixture('sockets')
22 changes: 22 additions & 0 deletions test/unit/https.test.js
@@ -0,0 +1,22 @@
import { loadFixture, getPort, Nuxt } from '../utils'

let nuxt = null

describe('basic https', () => {
beforeAll(async () => {
const options = await loadFixture('https')
nuxt = new Nuxt(options)
const port = await getPort()
await nuxt.listen(port, '0.0.0.0')
})

test('/', async () => {
const { html } = await nuxt.renderRoute('/')
expect(html.includes('<h1>Served over HTTPS!</h1>')).toBe(true)
})

// Close server and ask nuxt to stop listening to file changes
afterAll(async () => {
await nuxt.close()
})
})
21 changes: 21 additions & 0 deletions test/unit/sockets.test.js
@@ -0,0 +1,21 @@
import { loadFixture, Nuxt } from '../utils'

let nuxt = null

describe.skip.appveyor('basic sockets', () => {
beforeAll(async () => {
const options = await loadFixture('sockets')
nuxt = new Nuxt(options)
await nuxt.listen()
})

test('/', async () => {
const { html } = await nuxt.renderRoute('/')
expect(html.includes('<h1>Served over sockets!</h1>')).toBe(true)
})

// Close server and ask nuxt to stop listening to file changes
afterAll(async () => {
await nuxt.close()
})
})