From 497653d92e0f085580c6b8727114745a1e88a072 Mon Sep 17 00:00:00 2001 From: Lloyd Brookes Date: Tue, 31 May 2016 09:31:44 +0100 Subject: [PATCH] proxy connection errors no longer crash the server, fixes #37 --- bin/cli.js | 6 ++++++ example/rewrite/.local-web-server.json | 1 + example/rewrite/index.html | 2 ++ lib/middleware.js | 21 +++++++++++---------- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/bin/cli.js b/bin/cli.js index 8de7ca6..056796a 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -62,6 +62,12 @@ if (options.misc.help) { mocks: options.server.mocks }) + app.on('error', err => { + if (options.server['log-format']) { + console.error(ansi.format(err.message, 'red')) + } + }) + if (options.server.https) { options.server.key = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.key') options.server.cert = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.crt') diff --git a/example/rewrite/.local-web-server.json b/example/rewrite/.local-web-server.json index ae46592..1eb9003 100644 --- a/example/rewrite/.local-web-server.json +++ b/example/rewrite/.local-web-server.json @@ -2,6 +2,7 @@ "rewrite": [ { "from": "/css/*", "to": "/build/styles/$1" }, { "from": "/npm/*", "to": "http://registry.npmjs.org/$1" }, + { "from": "/broken/*", "to": "http://localhost:9999" }, { "from": "/:user/repos/:name", "to": "https://api.github.com/repos/:user/:name" } ] } diff --git a/example/rewrite/index.html b/example/rewrite/index.html index 2711101..02dcfd3 100644 --- a/example/rewrite/index.html +++ b/example/rewrite/index.html @@ -9,6 +9,7 @@ "rewrite": [ { "from": "/css/*", "to": "/build/styles/$1" }, { "from": "/npm/*", "to": "http://registry.npmjs.org/$1" }, + { "from": "/broken/*", "to": "http://localhost:9999" }, { "from": "/:user/repos/:name", "to": "https://api.github.com/repos/:user/:name" } ] } @@ -18,5 +19,6 @@ diff --git a/lib/middleware.js b/lib/middleware.js index 559adac..984b768 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -15,14 +15,13 @@ exports.blacklist = blacklist exports.mockResponses = mockResponses exports.mime = mime -function proxyRequest (route, app) { +function proxyRequest (route) { const httpProxy = require('http-proxy') const proxy = httpProxy.createProxyServer({ changeOrigin: true }) return function proxyMiddleware () { - const next = arguments[arguments.length - 1] const keys = [] route.re = pathToRegexp(route.from, keys) route.new = this.url.replace(route.re, route.to) @@ -33,17 +32,19 @@ function proxyRequest (route, app) { .replace(re, arguments[index + 1] || '') }) - this.response = false debug('proxy request', `from: ${this.path}, to: ${url.parse(route.new).href}`) - proxy.once('error', err => { - this.throw(500, `[PROXY] ${err.message}: ${route.new}`) - }) - proxy.once('proxyReq', function (proxyReq) { - proxyReq.path = url.parse(route.new).path + return new Promise((resolve, reject) => { + proxy.once('error', err => { + err.message = `[PROXY] Error: ${err.message} Target: ${route.new}` + reject(err) + }) + proxy.once('proxyReq', function (proxyReq) { + proxyReq.path = url.parse(route.new).path + }) + proxy.once('close', resolve) + proxy.web(this.req, this.res, { target: route.new }) }) - - proxy.web(this.req, this.res, { target: route.new }) } }