httpx-server
v2.0.0
Published
Respond to encrypted and unencrypted HTTP/1.1 and HTTP/2 requests on the same port
Downloads
1,033
Readme
httpx-server
Respond to encrypted and unencrypted HTTP/1.1 and HTTP/2 requests on the same port
Usage
Install httpx-server by running:
yarn add httpx-server
Start a server like so:
import * as httpx from 'httpx-server'
import makeCert from 'make-cert'
const { key, cert } = makeCert('localhost')
const server = httpx.createServer(
{ key, cert },
(request, response) => {
response.end('Hello World!')
}
)
server.listen(8080)
This starts a
net.Server
, that
examines the first byte of each request. If the first byte is 22 (0x16), we
know that the client is
negotiating a TLS connection, which we then route
to an
HTTP/2 server
that can handle both HTTP/1.1 and HTTP/2 requests over TLS. Otherwise, if the
request includes the text HTTP/1.1
, it is routed to an
HTTP/1.1 server.
And, if the request includes the text HTTP/2
, it is routed to a
clear text HTTP/2 server.
Enabling TLS is optional. If no certificate is passed in, the server will function, just without TLS support.
The code for differentiating between unencrypted HTTP/1.1 and HTTP/2 requests relies on currently deprecated code. There's an outstanding issue to undeprecate that code.
Upgrading from unencrypted HTTP/1.1 to HTTP/2 via the Upgrade
header is not
supported.
The returned server
object behaves like an
http.Server
or
http2.Http2Server
or
http2.Http2SecureServer
.
Properties, methods, and events common to both are implemented on this object.
In other words, binding an event listener to this object binds event listeners
to both the HTTP/1.1 and HTTP/2 server objects.
Requests are routed from net.Server
to http.Server
or http2.Http2Server
or http2.Http2SecureServer
using the
connection
event.
WebSocket is supported, both encrypted and unencrypted. ws
has a
usage example that
works with the server
object returned by httpx.createServer
.