An open API service indexing awesome lists of open source software.

https://github.com/bendrucker/http-app-router

Request router for building HTTP proxy servers
https://github.com/bendrucker/http-app-router

Last synced: about 1 year ago
JSON representation

Request router for building HTTP proxy servers

Awesome Lists containing this project

README

          

# http-app-router [![Build Status](https://travis-ci.org/bendrucker/http-app-router.svg?branch=master)](https://travis-ci.org/bendrucker/http-app-router) [![codecov](https://codecov.io/gh/bendrucker/http-app-router/branch/master/graph/badge.svg)](https://codecov.io/gh/bendrucker/http-app-router)

> Request router for building HTTP proxy servers

http-app-router is a Node HTTP router designed for serving multiple HTML applications on the same domain. HTML applications might include:

* A single page JavaScript web app
* A CMS-powered blog
* Static HTML content

If it speaks HTTP and sends HTML, it's an HTML app. Apps are defined with a server `host` and a list of `routes` that should match to that app. The router will make a request to your app and stream the response down to the client.

## Install

```
$ npm install --save http-app-router
```

## Usage

Pass an array of `apps` to the `Router` contructor to create a router handler. Use that handler to route requests and send a response if an app matches the request. Handlers are `req, res, callback` functions that you can use with plain `http.Server` instances or connect/express apps.

The router will *always* send a response when fetching the app is successful and will *never* send an error response. That's up to you.

```js
var Router = require('http-app-router')
var http = require('http')

var router = Router([
{
name: 'github',
host: 'github.com',
routes: [
'/bendrucker'
]
},
{
name: 'local',
host: 'localhost',
routes: '*'
}
])

var server = http.createServer(function (req, res) {
router(req, res, function (err) {
if (err) res.end('oh no, an error!')
})
})
```

## API

#### `Router(apps)` -> `function`

Returns a `router` function.

##### app

*Required*
Type: `array[object]`

An array of app objects, containing:

###### name

*Required*
Type: `string`

An application name.

###### host

*Required*
Type: `string`

The application host.

###### insecure

Type: `boolean`
Default: `false`

Toggles the app to be fetched over plain HTTP instead of HTTPS.

###### prefix

Type: `string`
Default: `''`

A prefix that will be removed from the URL before being passed along.

###### headers

Type: `object`

Optional headers to set on requests.

###### cookies

Type: `array[string]`

A whitelist of cookie names that can be sent by a client or set by an app.

###### transforms

Type: `array[string]`

An array of [`transform`](transforms.js) function keys that receive the `app` as an argument and return a [`Transform` stream](https://nodejs.org/api/stream.html#stream_class_stream_transform). The transform stream will receive and output HTML.

Built in:

* [absolute](github.com/bendrucker/absoluteify)

Or add custom things, maybe minification or something equally practical:

```js
var transforms = require('http-app-router/transforms')
var through = require('through2')

tranforms.uppercase = function (app) {
return through(function (chunk, enc, callback) {
callback(null, chunk.toString().toUpperCase())
})
}
```

#### `router.onLog(listener)` -> `function`

Listens on log output from the router.

##### listener

*Required*
Type: `function`
Arguments: `{level, message}`

## License

MIT © [Ben Drucker](http://bendrucker.me)