123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _node = _interopRequireDefault(require("parse/node"));
- var _express = _interopRequireDefault(require("express"));
- var _logger = _interopRequireDefault(require("./logger"));
- var _util = require("util");
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
- const Layer = require('express/lib/router/layer');
- function validateParameter(key, value) {
- if (key == 'className') {
- if (value.match(/_?[A-Za-z][A-Za-z_0-9]*/)) {
- return value;
- }
- } else if (key == 'objectId') {
- if (value.match(/[A-Za-z0-9]+/)) {
- return value;
- }
- } else {
- return value;
- }
- }
- class PromiseRouter {
-
-
-
-
-
-
-
-
-
- constructor(routes = [], appId) {
- this.routes = routes;
- this.appId = appId;
- this.mountRoutes();
- }
-
-
- mountRoutes() {}
-
- merge(router) {
- for (var route of router.routes) {
- this.routes.push(route);
- }
- }
- route(method, path, ...handlers) {
- switch (method) {
- case 'POST':
- case 'GET':
- case 'PUT':
- case 'DELETE':
- break;
- default:
- throw 'cannot route method: ' + method;
- }
- let handler = handlers[0];
- if (handlers.length > 1) {
- handler = function (req) {
- return handlers.reduce((promise, handler) => {
- return promise.then(() => {
- return handler(req);
- });
- }, Promise.resolve());
- };
- }
- this.routes.push({
- path: path,
- method: method,
- handler: handler,
- layer: new Layer(path, null, handler)
- });
- }
-
-
-
-
- match(method, path) {
- for (var route of this.routes) {
- if (route.method != method) {
- continue;
- }
- const layer = route.layer || new Layer(route.path, null, route.handler);
- const match = layer.match(path);
- if (match) {
- const params = layer.params;
- Object.keys(params).forEach(key => {
- params[key] = validateParameter(key, params[key]);
- });
- return {
- params: params,
- handler: route.handler
- };
- }
- }
- }
-
- mountOnto(expressApp) {
- this.routes.forEach(route => {
- const method = route.method.toLowerCase();
- const handler = makeExpressHandler(this.appId, route.handler);
- expressApp[method].call(expressApp, route.path, handler);
- });
- return expressApp;
- }
- expressRouter() {
- return this.mountOnto(_express.default.Router());
- }
- tryRouteRequest(method, path, request) {
- var match = this.match(method, path);
- if (!match) {
- throw new _node.default.Error(_node.default.Error.INVALID_JSON, 'cannot route ' + method + ' ' + path);
- }
- request.params = match.params;
- return new Promise((resolve, reject) => {
- match.handler(request).then(resolve, reject);
- });
- }
- }
- exports.default = PromiseRouter;
- function makeExpressHandler(appId, promiseHandler) {
- return function (req, res, next) {
- try {
- const url = maskSensitiveUrl(req);
- const body = Object.assign({}, req.body);
- const method = req.method;
- const headers = req.headers;
- _logger.default.logRequest({
- method,
- url,
- headers,
- body
- });
- promiseHandler(req).then(result => {
- if (!result.response && !result.location && !result.text) {
- _logger.default.error('the handler did not include a "response" or a "location" field');
- throw 'control should not get here';
- }
- _logger.default.logResponse({
- method,
- url,
- result
- });
- var status = result.status || 200;
- res.status(status);
- if (result.headers) {
- Object.keys(result.headers).forEach(header => {
- res.set(header, result.headers[header]);
- });
- }
- if (result.text) {
- res.send(result.text);
- return;
- }
- if (result.location) {
- res.set('Location', result.location);
-
-
- if (!result.response) {
- res.send('Found. Redirecting to ' + result.location);
- return;
- }
- }
- res.json(result.response);
- }, error => {
- next(error);
- }).catch(e => {
- _logger.default.error(`Error generating response. ${(0, _util.inspect)(e)}`, {
- error: e
- });
- next(e);
- });
- } catch (e) {
- _logger.default.error(`Error handling request: ${(0, _util.inspect)(e)}`, {
- error: e
- });
- next(e);
- }
- };
- }
- function maskSensitiveUrl(req) {
- let maskUrl = req.originalUrl.toString();
- const shouldMaskUrl = req.method === 'GET' && req.originalUrl.includes('/login') && !req.originalUrl.includes('classes');
- if (shouldMaskUrl) {
- maskUrl = _logger.default.maskSensitiveUrl(maskUrl);
- }
- return maskUrl;
- }
|