Skip to content

Commit 5a5971f

Browse files
authored
feat: recognize pfx format for http2 options (#202)
* fix: recognize pfx format for http2 options * test: add tests for https and http2 options with pfx and pem
1 parent 8bccec8 commit 5a5971f

File tree

10 files changed

+243
-2
lines changed

10 files changed

+243
-2
lines changed

lib/server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const select = (options, callback) => {
3131
if (http2) {
3232
if (http2 === true) {
3333
server = types.http2({}, callback);
34-
} else if (http2.cert) {
34+
} else if (http2.cert || http2.pfx) {
3535
secure = true;
3636
server = types.http2Secure(http2, callback);
3737
} else {

test/fixtures/https/app.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('ok');

test/fixtures/https/index.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!doctype>
2+
<html>
3+
<head>
4+
<title>fixture: https</title>
5+
</head>
6+
<body>
7+
<main></main>
8+
<script src="/output/output.js"></script>
9+
</body>
10+
</html>

test/fixtures/https/localhost.crt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIE7DCCAtSgAwIBAgIJANATvy4nMEs0MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
3+
BAMMCWxvY2FsaG9zdDAgFw0yMTAxMTcxNzM2MjVaGA8yMDUxMDExMDE3MzYyNVow
4+
FDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
5+
CgKCAgEA6PovbbkZx+8LXTS9NDitCXII40WJ8qyyC38EMlnRsY8rZ3ptMacawZQa
6+
Q10Jvo6xswzM54bRvvTxHXrltNSW7G/9Qp+KkM99Ee1ZgO1NqVH5Z8RftXjUGvTW
7+
M6ZRNLoRtZNyoK4G2r/xvbMZhv/nW80/vvfXzXfqUWoqb/4hVeVC7cYPqWVXkyuy
8+
rB+BJmv7LMYSX1p8az9E+lP4tSQa8VzrlYWQhVr40jhZV/A/Ssxv6ENBvc9sRHbz
9+
GEqEHD0+rP7A0goLMSjHk0HZzaoC+mmgOzVUwbUvhuvzPBOrxkf0fy+p7zFH1ASN
10+
zC9pWggjJJJnMBd6ItZilZIvY9gprnu+buZGuHRhs4Byv90/34/r9o/eTdrYulzJ
11+
sXkmLp28YqwYXX8CxDtreQIzShjIPzQmGMnWE27xisL9rXWW3wI9lRyO6w+19aAL
12+
U+mpP30HGFETpefNHq/55dvZUGwe95oALVJaytoUheKChmw4uQlf8tY2U3h9TkD9
13+
3qtDVEKvUWnLY1SKEFN1iH42f+gU/IDnQPvCtD69XbYb/ivY/EsppiLXs0/kzQ9w
14+
8y+O0P70LPiaYg6hkCF+bgu3mPikrQEI9Ka9KRRICxh0yTRxOL0GHBNMxfUC4G+8
15+
k/MvENHAwQqK6oFF7TtIBYuW6gD10HUSGxDuPrQ5vjM78GYGAv0CAwEAAaM/MD0w
16+
CQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwIwYDVR0RBBwwGoINd3d3LmxvY2FsaG9z
17+
dIIJbG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4ICAQDKvdg7NEWHBp/CKMr/Ombi
18+
AAJgDgjgMzhzz2aQqdskJfoU/AeKBYoQnh4tOHM3FKj+U4+pxHjbQMBshsDbwya9
19+
177HYG8A9cBbrlZEseR/bWzOwy1V+td5jUT5aYv+ajMloS27U2KEieaSiLhFYKQY
20+
HY+sR3wkLAiS5rapq61xvLMNC6xmqeMcnn9PZYV1B8rBBPR5PPUunGSzEE2zRpv6
21+
jO28d18B+zhqKiJr7TJunUKkPwYBVHm/OYhikyt3SB/a0KwYJmzfqJh0hP6vCOz5
22+
5CAkmPon6N33AEs73V5X7zpqR5d0jRGrD30Twx23KxJTdUeo+BQ5Fi5roxvnW1am
23+
5BP++KEyEvoJtzft5GY5wb5fBNv9Ek5n8O5HBACfDnZN3N+1RLIbAXrjTkBpL6vx
24+
bFf5ZM5LmQ3JvcMPvoZlxHonmgaB9GDNzCllxbMCaR9oW/5h9XYwk8MXAk/SLrn6
25+
MXgokarf2Ij2FkPx40ilcL9D5GoHi2A9eIYdRPxschG2HsZeIv8R2BQsnYa+WwGN
26+
vxHxCHroqoDVAylo1W1OxdOxMUYaH+nHp5JE1H52jIq7pafBE62EAZut24FyGU6M
27+
zopgCwxi+ARV/HO+nmc8smP4+X1FBCW8qUsmZWqoLztQmO3ZfBO8UPv+aY5dA2Hz
28+
nCwe6GqeCrfvOQNVdDrV3Q==
29+
-----END CERTIFICATE-----

test/fixtures/https/localhost.key

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
51+
kyqwVw4XIqGsQkNCIfToMOEJ7Gpqef4=
52+
-----END PRIVATE KEY-----

test/fixtures/https/localhost.pfx

3.93 KB
Binary file not shown.

test/fixtures/https/webpack.config.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const { resolve } = require('path');
2+
3+
module.exports = {
4+
context: __dirname,
5+
entry: ['./app.js', 'webpack-plugin-serve/client'],
6+
mode: 'development',
7+
output: {
8+
filename: './output.js',
9+
path: resolve(__dirname, './output'),
10+
publicPath: 'output/'
11+
},
12+
resolve: {
13+
alias: {
14+
'webpack-plugin-serve/client': resolve(__dirname, '../../../client')
15+
}
16+
},
17+
watch: true
18+
};

test/https.test.js

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
const https = require('https');
2+
3+
const { readFileSync } = require('fs');
4+
5+
const { resolve, join } = require('path');
6+
7+
const http2 = require('http2');
8+
9+
const webpack = require('webpack');
10+
const test = require('ava');
11+
const fetch = require('node-fetch');
12+
const defer = require('p-defer');
13+
const del = require('del');
14+
15+
const { WebpackPluginServe } = require('../lib');
16+
17+
const { getPort } = require('./helpers/port');
18+
const webpackDefaultConfig = require('./fixtures/https/webpack.config');
19+
20+
const httpsFixturePath = resolve(__dirname, './fixtures/https');
21+
22+
const startServe = async (serve) => {
23+
const deferred = defer();
24+
const compiler = webpack({
25+
...webpackDefaultConfig,
26+
plugins: [serve]
27+
});
28+
const watcher = compiler.watch({}, () => {});
29+
serve.on('listening', deferred.resolve);
30+
await deferred.promise;
31+
return watcher;
32+
};
33+
34+
const checkHttpsServed = async (t, serve, port) => {
35+
const watcher = await startServe(serve);
36+
const agent = new https.Agent({
37+
rejectUnauthorized: false
38+
});
39+
const response = await fetch(`https://localhost:${port}`, { agent });
40+
watcher.close();
41+
t.true(response.ok);
42+
};
43+
44+
const checkHttp2Served = async (t, serve, port) => {
45+
const watcher = await startServe(serve);
46+
const deferred = defer();
47+
const client = http2.connect(`https://localhost:${port}`, {
48+
rejectUnauthorized: false
49+
});
50+
client.on('error', (err) => {
51+
t.fail(err);
52+
deferred.reject();
53+
});
54+
55+
const req = client.request({ ':path': '/' });
56+
req.on('response', () => {
57+
t.pass();
58+
watcher.close();
59+
client.close();
60+
deferred.resolve();
61+
});
62+
req.on('end', () => {
63+
client.close();
64+
deferred.resolve();
65+
});
66+
67+
await deferred.promise;
68+
};
69+
70+
test.after.always('remove build output', async () => {
71+
await del('./test/fixtures/https/output');
72+
});
73+
74+
test('should start https with pem', async (t) => {
75+
const port = await getPort();
76+
const key = readFileSync(join(httpsFixturePath, 'localhost.key'));
77+
const cert = readFileSync(join(httpsFixturePath, 'localhost.crt'));
78+
const serve = new WebpackPluginServe({
79+
host: 'localhost',
80+
allowMany: true,
81+
port,
82+
waitForBuild: true,
83+
https: { key, cert }
84+
});
85+
86+
await checkHttpsServed(t, serve, port);
87+
});
88+
89+
test('should start http2 with pem', async (t) => {
90+
const port = await getPort();
91+
const key = readFileSync(join(httpsFixturePath, 'localhost.key'));
92+
const cert = readFileSync(join(httpsFixturePath, 'localhost.crt'));
93+
const serve = new WebpackPluginServe({
94+
host: 'localhost',
95+
allowMany: true,
96+
port,
97+
waitForBuild: true,
98+
http2: { key, cert }
99+
});
100+
101+
await checkHttp2Served(t, serve, port);
102+
});
103+
104+
test('should start https with pfx', async (t) => {
105+
const port = await getPort();
106+
const pfx = readFileSync(join(httpsFixturePath, 'localhost.pfx'));
107+
const serve = new WebpackPluginServe({
108+
host: 'localhost',
109+
allowMany: true,
110+
port,
111+
waitForBuild: true,
112+
https: { pfx, passphrase: 'password' }
113+
});
114+
115+
await checkHttpsServed(t, serve, port);
116+
});
117+
118+
test('should start http2 with pfx', async (t) => {
119+
const port = await getPort();
120+
const pfx = readFileSync(join(httpsFixturePath, 'localhost.pfx'));
121+
const serve = new WebpackPluginServe({
122+
host: 'localhost',
123+
allowMany: true,
124+
port,
125+
waitForBuild: true,
126+
http2: { pfx, passphrase: 'password' }
127+
});
128+
129+
await checkHttp2Served(t, serve, port);
130+
});

test/snapshots/plugin.test.js.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
The actual snapshot is saved in `plugin.test.js.snap`.
44

5-
Generated by [AVA](https://ava.li).
5+
Generated by [AVA](https://avajs.dev).
66

77
## allow https null
88

@@ -113,6 +113,7 @@ Generated by [AVA](https://ava.li).
113113
> Snapshot 1
114114
115115
[
116+
'test/fixtures/https',
116117
'test/fixtures/multi',
117118
'test/fixtures/proxy',
118119
'test/fixtures/ramdisk',

test/snapshots/plugin.test.js.snap

9 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)