Fastify supports HTTP2 over either HTTPS (h2) or plaintext (h2c).
Currently, none of the HTTP2-specific APIs are available through Fastify, but
Node's req
and res
can be accessed through our Request
and Reply
interface. PRs are welcome.
HTTP2 is supported in all modern browsers only over a secure connection:
'use strict'
const fs = require('node:fs')
const path = require('node:path')
const fastify = require('fastify')({
http2: true,
https: {
key: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.key')),
cert: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.cert'))
}
})
fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})
fastify.listen({ port: 3000 })
ALPN negotiation allows
support for both HTTPS and HTTP/2 over the same socket.
Node core req
and res
objects can be either
HTTP/1 or
HTTP/2. Fastify supports this out of the
box:
'use strict'
const fs = require('node:fs')
const path = require('node:path')
const fastify = require('fastify')({
http2: true,
https: {
allowHTTP1: true, // fallback support for HTTP1
key: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.key')),
cert: fs.readFileSync(path.join(__dirname, '..', 'https', 'fastify.cert'))
}
})
// this route can be accessed through both protocols
fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})
fastify.listen({ port: 3000 })
You can test your new server with:
$ npx h2url https://localhost:3000
If you are building microservices, you can connect to HTTP2 in plain text, however, this is not supported by browsers.
'use strict'
const fastify = require('fastify')({
http2: true
})
fastify.get('/', function (request, reply) {
reply.code(200).send({ hello: 'world' })
})
fastify.listen({ port: 3000 })
You can test your new server with:
$ npx h2url http://localhost:3000