Skip to content
This repository has been archived by the owner on Apr 14, 2021. It is now read-only.

Don't read body, just set the Content-Length header #68

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ function secureCookie(value, validDuration, cookieKey) {
}


module.exports.cookie = secureCookie;
module.exports.secureCookie = secureCookie;
48 changes: 15 additions & 33 deletions app/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,25 @@ const log = require('bole')('proxy');

var proxy = httpProxy.createProxyServer(config.proxy);

proxy.on('proxyReq', function (proxyReq, req, res, options) {
proxyReq.setHeader('Cookie', insert_auth_cookie(req));
proxy_body(req, proxyReq);
});

proxy.on('proxyReqWs', function (proxyReqWs, req, res, options) {
proxyReqWs.setHeader('Cookie', insert_auth_cookie(req));
proxy_body(req, proxyReqWs);
});

proxy.on('proxyReq', proxy_request);
proxy.on('proxyReqWs', proxy_request);
proxy.on('error', function (err) {
log.error(err);
});

function insert_auth_cookie(req) {
return insert_cookie(req, 'user-id', auth.cookie(
config.rstudio.user, config.rstudio.duration, config.rstudio.key));
}
function proxy_request(proxyReq, req, res, options) {
const secureCookie = auth.secureCookie(
config.rstudio.user,
config.rstudio.duration,
config.rstudio.key,
);
const cookies = insert_cookie(req, 'user-id', secureCookie);

proxyReq.setHeader('Cookie', cookies);
if (req.headers['content-length']) {
proxyReq.setHeader('Content-Length', req.headers['content-length']);
}
};

function insert_cookie(req, name, value) {
log.debug('cookie header:', req.headers['Cookie']);
Expand All @@ -39,24 +40,5 @@ function insert_cookie(req, name, value) {
return cookies.join('; ');
}

function proxy_body(req, proxyReq) {
if (req.body && req.body.length) {
proxyReq.setHeader('Content-Length', content_length(req));
write_body(req, proxyReq);
}
}

function content_length(req) {
return req.body.reduce(function (length, chunk) {
return length + chunk.byteLength;
}, 0);
}

function write_body(req, proxyReq) {
req.body.map(function (chunk) {
proxyReq.write(chunk);
});
}


module.exports = proxy;
14 changes: 1 addition & 13 deletions app/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,11 @@ router.get('/callback', [
},
]);

function parseBody(req) {
const body = [];
return new Promise((resolve, reject) => {
req.on('data', (chunk) => { body.push(chunk); });
req.on('end', () => { resolve(body); });
req.on('error', (err) => { reject(err); });
});
}

router.all(/.*/, [
ensureLoggedIn('/login'),
authorization,
(req, res) => {
parseBody(req).then((body) => {
req.body = body;
proxy.web(req, res);
});
proxy.web(req, res);
},
]);

Expand Down