node-http2-proxy
A simple high performance http/2 & http/1 to http/1 spec compliant proxy helper for Node.
Features
Installation
$ npm install http2-proxy
Notes
http2-proxy
requires node v8.5.0 or newer with http2
enabled. Pass the --expose-http2
option when starting node v8.x.x.
HTTP/1 API
You must pass allowHTTP1: true
to the http2.createServer
or http2.createSecureServer
factory methods.
import http2 from 'http2'
import proxy from 'http2-proxy'
const server = http2.createServer({ allowHTTP1: true })
server.listen(8000)
Proxy HTTP/2, HTTP/1 and WebSocket
server.on('request', (req, res) => {
proxy.web(req, res, {
hostname: 'localhost'
port: 9000
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
server.on('upgrade', (req, socket, head) => {
proxy.ws(req, socket, head, {
hostname: 'localhost'
port: 9000
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
server.on('request', (req, res) => {
proxy.web(req, res, {
hostname: 'localhost'
port: 9000,
onRes: (req, res) => helmet(req, res, () => {})
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
server.on('request', (req, res) => {
proxy.web(req, res, {
hostname: 'localhost'
port: 9000,
onReq: (req, { headers }) => {
headers['x-forwarded-for'] = req.socket.remoteAddress
headers['x-forwarded-proto'] = req.socket.encrypted ? 'https' : 'http'
headers['x-forwarded-host'] = req.headers['host']
}
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
web (req, res, options, [callback])
Returns a promise if no callback is provided.
See request
ws (req, socket, head, options, [callback])
Returns a promise if no callback is provided.
See upgrade
Options
HTTP/2 API
If HTTP/1 support is not required use the HTTP/2 stream
API which has a lower overhead.
import http2 from 'http2'
import proxy from 'http2-proxy'
const server = http2.createServer()
server.listen(8000)
Proxy HTTP/2
server.on('stream', (stream, headers) => {
proxy.web(stream, headers, {
hostname: 'localhost'
port: 9000
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
server.on('stream', (stream, headers) => {
proxy.web(stream, headers, {
hostname: 'localhost'
port: 9000,
onReq: (stream, { headers }) => {
headers['x-forwarded-for'] = stream.socket.remoteAddress
headers['x-forwarded-proto'] = stream.socket.encrypted ? 'https' : 'http'
headers['x-forwarded-host'] = stream.headers['host']
}
}, err => {
if (err) {
console.error('proxy error', err)
}
})
})
stream
: http2.Http2Stream
headers
: Request headers objectoptions
: See Optionscallback(err)
: Called on completion or error. Optional
Returns a promise if no callback is provided.
See request
Options
License
MIT