Skip to content

Commit

Permalink
Add HTTPS and HTTP/2 support for adapter-node
Browse files Browse the repository at this point in the history
  • Loading branch information
aradalvand committed Jun 18, 2023
1 parent a71d783 commit 114a589
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 6 deletions.
5 changes: 5 additions & 0 deletions .changeset/mighty-wasps-perform.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/adapter-node': minor
---

feat: add opt-in HTTPS and HTTP/2 support
12 changes: 12 additions & 0 deletions documentation/docs/25-build-and-deploy/40-adapter-node.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,18 @@ We instead read from the _right_, accounting for the number of trusted proxies.

The maximum request body size to accept in bytes including while streaming. Defaults to 512kb. You can disable this option with a value of 0 and implement a custom check in [`handle`](hooks#server-hooks-handle) if you need something more advanced.

### `CERT_PATH`, `CERT_KEY_PATH`, and `HTTPS_PORT`:
By default, the server only listens for plain HTTP requests. To enable an additional HTTPS endpoint, you must provide the `CERT_PATH` and `CERT_KEY_PATH` environment variables pointing to a file containing a valid certificate and a file containing its associated private key respectively, both in the PEM format.
The files are read once on startup, so if the contents of the files change, the app will need to be restarted.

The default port that will be used for the HTTPS endpoint is 3001. You can customize this via the `HTTPS_PORT` environment variable.

### `NO_HTTP2`:
By default, the HTTPS endpoint will support HTTP/2 as well as HTTP/1.1. If, for some reason, supporting HTTP/2 isn't desirable, you can disable it by setting the `NO_HTTP2` environment variable to a non-empty value (e.g. `1`).

### `ONLY_HTTPS`:
If you only need an HTTPS endpoint and want to opt out of the default plain HTTP one, you can do so by setting the `ONLY_HTTPS` environment variable to a non-empty value (e.g. `1`).

## Options

The adapter can be configured with various options:
Expand Down
7 changes: 6 additions & 1 deletion packages/adapter-node/src/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ const expected = new Set([
'ADDRESS_HEADER',
'PROTOCOL_HEADER',
'HOST_HEADER',
'BODY_SIZE_LIMIT'
'BODY_SIZE_LIMIT',
'CERT_PATH',
'CERT_KEY_PATH',
'HTTPS_PORT',
'ONLY_HTTPS',
'NO_HTTP2'
]);

if (ENV_PREFIX) {
Expand Down
33 changes: 28 additions & 5 deletions packages/adapter-node/src/index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,38 @@
import { handler } from 'HANDLER';
import { env } from 'ENV';
import polka from 'polka';
import http from 'node:http';
import https from 'node:https';
import http2 from 'node:http2';
import fs from 'node:fs';

export const path = env('SOCKET_PATH', false);
export const host = env('HOST', '0.0.0.0');
export const port = env('PORT', !path && '3000');
export const cert_path = env('CERT_PATH', false);
export const cert_key_path = env('CERT_KEY_PATH', false);
export const https_port = env('HTTPS_PORT', !path && '3001');
export const only_https = env('ONLY_HTTPS', false);
export const no_http2 = env('NO_HTTP2', false);

const server = polka().use(handler);
const app = polka().use(handler);

server.listen({ path, host, port }, () => {
console.log(`Listening on ${path ? path : host + ':' + port}`);
});
if (!only_https) {
http.createServer(app.handler).listen({ path, host, port }, () => {
console.log(`Listening on http://${path ? path : host + ':' + port}`);
});
}

export { server };
if (cert_path && cert_key_path) {
const cert = fs.readFileSync(cert_path);
const key = fs.readFileSync(cert_key_path);
const https_server = no_http2
? https.createServer({ cert, key }, app.handler)
: http2.createSecureServer({ allowHTTP1: true, cert, key }, app.handler);

https_server.listen({ path, host, https_port }, () => {
console.log(`Listening on https://${path ? path : host + ':' + https_port}`);
});
}

export { app as server };

0 comments on commit 114a589

Please sign in to comment.