Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
const { Router } = require('express');
const request = require('request');
const bodyParser = require('body-parser');
const querystring = require('querystring');
const { parse } = require('url');
const cookieParser = require('cookie-parser');
const { extendSetCookieHeadersForLocalDomain } = require('./proxyHelper');

const proxy = API => (req, res) => {
  const url = `${API}${parse(req.originalUrl).path}`;

  // extract headers, except `host` and `origin`
  // eslint-disable-next-line no-unused-vars
  const { host, origin, ...headers } = req.headers;
  const { method } = req;
  let body;
  let encoding;
  if (req.body && req.headers['content-type'] === 'application/x-www-form-urlencoded') {
    body = querystring.stringify(req.body);
  }
  if (req.body && req.headers['content-type'] === 'application/json') {
    body = JSON.stringify(req.body);
  }
  if (
    req.headers['content-type'] === 'image/png' ||
    req.headers['content-type'] === 'image/jpeg' ||
    req.headers['content-type'] === 'application/octet-stream'
  ) {
    body = req.rawBody;
    // to avoid utf8 encoding for buffer
    encoding = null;
  }

  console.log(`Proxying ${method}: ${url}`);

  // make a new request, pipe result to response
  // encoding by default is undefined
  // https://www.npmjs.com/package/request
  request({ url, headers, method, body, encoding })
    .on('error', err => {
      // handle pipe errors
      req.next(err);
    })
    .on('response', extendSetCookieHeadersForLocalDomain.bind(null, req.hostname))
    .pipe(res);
};

const rawBodySaver = (req, res, buf) => {
  if (buf && buf.length) {
    req.rawBody = buf;
  }
};

module.exports = ({ API }) => {
  if (process.env.NODE_ENV === 'development') {
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
  }
  const middleware = Router();

  middleware.use(
    ['/mydoodle/upgradeGoogleCodeAndConnect.html', '/mydoodle/upgradeOutlookComCodeAndConnect.html'],
    bodyParser.json(),
    proxy(API)
  );
  middleware.use(
    ['/api/v2.0/users/oauth/facebook', '/api/v2.0/users/oauth/google', '/api/v2.0/users/microsoft-code-for-login'],
    bodyParser.urlencoded({ extended: true }),
    cookieParser(),
    proxy(API)
  );
  middleware.use(
    ['/api/v2.0/users/me/avatar', '/api/v2.0/users/me/branding/logo', '/api/v2.0/users/me/branding/background'],
    bodyParser.raw({ limit: '5mb', verify: rawBodySaver, type: '*/*' }),
    proxy(API)
  );
  middleware.use('/api/v2.0/users', bodyParser.json(), proxy(API));
  middleware.use('/np/users', bodyParser.urlencoded({ extended: true }), proxy(API));
  middleware.use('/api/v2.0/premium', proxy(API));

  return middleware;
};