Skip to content

Commit 035186f

Browse files
committed
Merge pull request #8 from IGZgustavomarin/feature-upload-images-proxy
added http-proxy to fix image uploads
2 parents 569dce7 + 7b7f7af commit 035186f

File tree

6 files changed

+96
-23
lines changed

6 files changed

+96
-23
lines changed

config_sample.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,8 @@
114114
"path" : "/api/profile",
115115
"methods" : ["GET", "PUT"]
116116
}
117+
],
118+
"directProxyUrls": [
119+
"\/upload$"
117120
]
118121
}

config_schema.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,6 @@
177177
"required": true
178178
}
179179
},
180-
"additionalProperties": false
181-
}
180+
"additionalProperties": false,
181+
"directProxyUrls": { "type": "array", "items": {"type": "string"} }
182+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"countries-info": "^1.0.6",
1212
"debug": "^2.1.0",
1313
"escape-regexp": "0.0.1",
14+
"http-proxy": "^1.8.1",
1415
"jsonschema": "^1.0.0",
1516
"lodash": "^3.1.0",
1617
"mongodb": "^1.4.22",

src/cipherlayer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var prepareOptions = require('./middlewares/prepareOptions.js');
1919
var platformsSetUp = require('./middlewares/platformsSetUp.js');
2020
var propagateRequest = require('./middlewares/propagateRequest.js');
2121
var permissions = require('./middlewares/permissions.js');
22+
var bodyParserWrapper = require('./middlewares/bodyParserWrapper.js');
2223

2324
var versionControl = require('version-control');
2425

@@ -59,7 +60,8 @@ function startListener(publicPort, privatePort, cbk){
5960
});
6061

6162
server.use(restify.queryParser());
62-
server.use(restify.bodyParser({maxBodySize: 1024 * 1024 * 3}));
63+
server.use(bodyParserWrapper(restify.bodyParser({maxBodySize: 1024 * 1024 * 3})));
64+
6365
server.use(function(req,res,next){
6466
debug('> ' + req.method + ' ' + req.url);
6567
next();
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
var config = require('../../config.json');
2+
var _ = require('lodash');
3+
4+
var wrapper = module.exports = function(middleware) {
5+
return function(req, res, next) {
6+
7+
var useDirectProxy = _.some(config.directProxyUrls, function(pattern) {
8+
return req.url.match(new RegExp(pattern, 'g'));
9+
});
10+
11+
// if url is a proxy request, don't do anything and move to next middleware
12+
if(useDirectProxy) {
13+
next();
14+
}
15+
// else invoke middleware
16+
else {
17+
// some middleware is an array (ex. bodyParser)
18+
if(middleware instanceof Array) {
19+
middleware[0](req, res, function() {
20+
middleware[1](req, res, next);
21+
});
22+
}
23+
else {
24+
middleware(req, res, next);
25+
}
26+
}
27+
};
28+
};
Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,69 @@
1+
var config = require('../../config.json');
12
var debug = require('debug')('cipherlayer:service');
23
var request = require('request');
4+
var httpProxy = require('http-proxy');
5+
var _ = require('lodash');
6+
7+
var proxy = httpProxy.createProxyServer({});
8+
9+
proxy.on('proxyReq', function(proxyReq, req, res, options) {
10+
debug('> http-proxy request received');
11+
});
12+
13+
proxy.on('proxyRes', function() {
14+
debug('< http-proxy response received');
15+
});
16+
17+
proxy.on('error', function (err, req, res) {
18+
debug('http-proxy error occurred', err);
19+
res.send(500, {err:' auth_proxy_error', des: 'there was an internal error when redirecting the call to protected service'});
20+
});
21+
22+
23+
324

425
function propagateRequest(req, res, next){
526
var start = Date.now();
627

7-
request(req.options, function(err, private_res, body) {
8-
var timing = Date.now() - start;
9-
if(err) {
10-
debug('<= ' + private_res.statusCode + ' ' + err + ' ' + timing + 'ms');
11-
res.send(500, {err:' auth_proxy_error', des: 'there was an internal error when redirecting the call to protected service'});
28+
var useDirectProxy = _.some(config.directProxyUrls, function(pattern) {
29+
return req.url.match(new RegExp(pattern, 'g'));
30+
});
31+
32+
// if url is a direct proxy request, use http-proxy
33+
if (useDirectProxy) {
34+
35+
proxy.web(req, res, {
36+
target: 'http://'+ config.private_host + ':' + config.private_port
37+
});
38+
return;
39+
1240
} else {
13-
try{
14-
body = JSON.parse(body);
15-
debug('<= ' + private_res.statusCode + ' json body' + ' ' + timing + 'ms');
16-
} catch(ex) {
17-
debug('<= ' + private_res.statusCode + ' no json body' + ' ' + timing + 'ms');
18-
}
19-
if(private_res.statusCode === 302){
20-
res.header('Location', private_res.headers.location);
21-
res.send(302);
22-
} else {
23-
res.send(Number(private_res.statusCode), body);
24-
}
25-
}
2641

27-
return next();
28-
});
42+
// This are the normal requests
43+
44+
request(req.options, function(err, private_res, body) {
45+
var timing = Date.now() - start;
46+
if(err) {
47+
debug('<= ' + private_res.statusCode + ' ' + err + ' ' + timing + 'ms');
48+
res.send(500, {err:' auth_proxy_error', des: 'there was an internal error when redirecting the call to protected service'});
49+
} else {
50+
try{
51+
body = JSON.parse(body);
52+
debug('<= ' + private_res.statusCode + ' json body' + ' ' + timing + 'ms');
53+
} catch(ex) {
54+
debug('<= ' + private_res.statusCode + ' no json body' + ' ' + timing + 'ms');
55+
}
56+
if(private_res.statusCode === 302){
57+
res.header('Location', private_res.headers.location);
58+
res.send(302);
59+
} else {
60+
res.send(Number(private_res.statusCode), body);
61+
}
62+
}
63+
64+
return next();
65+
});
66+
}
2967
}
3068

3169
module.exports = propagateRequest;

0 commit comments

Comments
 (0)