JSPM

  • Created
  • Published
  • Downloads 29341
  • Score
    100M100P100Q138459F
  • License MIT

Package Exports

  • http2-proxy

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (http2-proxy) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

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.6.0 or newer with http2 enabled. Pass the --expose-http2 option when starting node v8.x.x. While http2 is still experimental in node it is not recommended to use it in production! Wait for node v9.0.0.

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)

You can also use http-proxy2 with the old http && https API's.

import http from 'http'

const server = http.createServer()
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)
    }
  })
})

Use Helmet to secure response headers

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)
    }
  })
})

Add x-forwarded headers

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)
    }
  })
})

Follow Redirects

const http = require('follow-redirects').http

server.on('request', (req, res) => {
  proxy.web(req, res, {
    hostname: 'localhost'
    port: 9000,
    onReq: (req, options) => http.request(options)
  }, 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.

Note that the onRes signature differs from HTTP/1 mode.

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)
    }
  })
})

Add x-forwarded headers

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)
    }
  })
})

web (stream, headers, options, [callback])

  • stream: http2.Http2Stream
  • headers: Request headers object
  • options: See Options
  • callback(err): Called on completion or error. Optional

Returns a promise if no callback is provided.

See request

Options

License

MIT