<h1 align="center">Fastify</h1>

## HTTP2

_Fastify_ offers **experimental support** for HTTP2 starting from Node
8.8.0, which includes HTTP2 without a flag. _Fastify_ supports HTTP2
both over HTTPS or over plaintext. Note that HTTP2 is available only for node versions >= `8.8.1`.

Currently none of the HTTP2-specific APIs are available through
_Fastify_, but Node's `req` and `res` can be access through our
`Request` and `Reply` interface. PRs are welcome.

### Secure (HTTPS)

HTTP2 is supported in all modern browsers __only over a secure
connection__:

```js
'use strict'

const fs = require('fs')
const path = require('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(3000)
```

ALPN negotiation allows to support both HTTPS and HTTP/2 over the same socket.
Node core `req` and `res` objects can be either [HTTP/1](https://nodejs.org/api/http.html)
or [HTTP/2](https://nodejs.org/api/http2.html).
_Fastify_ supports this out of the box:

```js
'use strict'

const fs = require('fs')
const path = require('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(3000)
```

You can test your new server with:

```
$ npx h2url https://localhost:3000
```

### Plain or insecure

If you are building microservices, you can connect to HTTP2 in plain
text, however this is not supported by browsers.

```js
'use strict'

const fastify = require('fastify')({
  http2: true
})

fastify.get('/', function (request, reply) {
  reply.code(200).send({ hello: 'world' })
})

fastify.listen(3000)
```

You can test your new server with:

```
$ npx h2url http://localhost:3000
```

