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
- Host: GitHub
- URL: https://github.com/bendrucker/http-app-router
- Owner: bendrucker
- License: mit
- Created: 2016-07-05T19:45:18.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2018-11-13T19:20:16.000Z (over 7 years ago)
- Last Synced: 2025-06-28T13:43:19.663Z (about 1 year ago)
- Language: JavaScript
- Homepage:
- Size: 47.9 KB
- Stars: 3
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: license
Awesome Lists containing this project
README
# http-app-router [](https://travis-ci.org/bendrucker/http-app-router) [](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)