"use strict"; /* * Copyright 2016 Google Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.init = exports.handleUpgrade = exports.handleRequest = exports.getRequestPort = void 0; var http = require("http"); var httpProxy = require("http-proxy"); var logging = require("./logging"); var appSettings; var proxy = httpProxy.createProxyServer(null); var regex = new RegExp('/_proxy/([0-9]+)($|/)'); function errorHandler(error, request, responseOrSocket) { logging.getLogger().error("Reverse proxy error for ".concat(request.url, ": ").concat(error)); if (responseOrSocket instanceof http.ServerResponse) { responseOrSocket.writeHead(500, 'Reverse Proxy Error.'); } responseOrSocket.end(); } /** * Get port from request. If the request should be handled by reverse proxy, * returns the port. Otherwise, returns 0. */ function getRequestPort(path) { if (path) { var match = regex.exec(path); if (match) { return Number(match[1]); } } return 0; } exports.getRequestPort = getRequestPort; /** * Handle request by sending it to the internal http endpoint. */ function handleRequest(request, response, port) { request.url = request.url.replace(regex, ''); var host = 'localhost'; if ('TEST_TMPDIR' in process.env) { host = '[::1]'; // Avoid DNS. } var target = "http://".concat(host, ":").concat(port); proxy.web(request, response, { target: target }); } exports.handleRequest = handleRequest; /** * Handle request by sending it to the internal ws endpoint. */ function handleUpgrade(request, sock, head, port) { request.url = request.url.replace(regex, ''); var host = 'localhost'; if ('TEST_TMPDIR' in process.env) { host = '[::1]'; // Avoid DNS. } var target = "ws://".concat(host, ":").concat(port); proxy.ws(request, sock, head, { target: target }); } exports.handleUpgrade = handleUpgrade; /** * Initialize the handler. */ function init(settings) { appSettings = settings; proxy.on('error', errorHandler); } exports.init = init; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZVByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvY29sYWIvc291cmNlcy9yZXZlcnNlUHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHOzs7QUFFSCwyQkFBNkI7QUFDN0Isc0NBQXdDO0FBSXhDLG1DQUFxQztBQUVyQyxJQUFJLFdBQXdCLENBQUM7QUFDN0IsSUFBTSxLQUFLLEdBQTBCLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RSxJQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBRWxELFNBQVMsWUFBWSxDQUNqQixLQUFZLEVBQUUsT0FBNkIsRUFDM0MsZ0JBQWdEO0lBQ2xELE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsa0NBQTJCLE9BQU8sQ0FBQyxHQUFHLGVBQUssS0FBSyxDQUFFLENBQUMsQ0FBQztJQUM5RSxJQUFJLGdCQUFnQixZQUFZLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwRCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWTtJQUN6QyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFSRCx3Q0FRQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUN6QixPQUE2QixFQUFFLFFBQTZCLEVBQzVELElBQVk7SUFDZCxPQUFPLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJLElBQUksR0FBRyxXQUFXLENBQUM7SUFDdkIsSUFBSSxhQUFhLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBRSxhQUFhO0lBQ2hDLENBQUM7SUFDRCxJQUFNLE1BQU0sR0FBRyxpQkFBVSxJQUFJLGNBQUksSUFBSSxDQUFFLENBQUM7SUFFeEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFYRCxzQ0FXQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUN6QixPQUE2QixFQUFFLElBQWdCLEVBQUUsSUFBWSxFQUM3RCxJQUFZO0lBQ2QsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUMsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQ3ZCLElBQUksYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUUsYUFBYTtJQUNoQyxDQUFDO0lBQ0QsSUFBTSxNQUFNLEdBQUcsZUFBUSxJQUFJLGNBQUksSUFBSSxDQUFFLENBQUM7SUFFdEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFDLE1BQU0sUUFBQSxFQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBWEQsc0NBV0M7QUFHRDs7R0FFRztBQUNILFNBQWdCLElBQUksQ0FBQyxRQUFxQjtJQUN4QyxXQUFXLEdBQUcsUUFBUSxDQUFDO0lBQ3ZCLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFIRCxvQkFHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90XG4gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZlxuICogdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVRcbiAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZVxuICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXJcbiAqIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBodHRwUHJveHkgZnJvbSAnaHR0cC1wcm94eSc7XG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcblxuaW1wb3J0IHtBcHBTZXR0aW5nc30gZnJvbSAnLi9hcHBTZXR0aW5ncyc7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gJy4vbG9nZ2luZyc7XG5cbmxldCBhcHBTZXR0aW5nczogQXBwU2V0dGluZ3M7XG5jb25zdCBwcm94eTogaHR0cFByb3h5LlByb3h5U2VydmVyID0gaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKG51bGwpO1xuY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCcvX3Byb3h5LyhbMC05XSspKCR8LyknKTtcblxuZnVuY3Rpb24gZXJyb3JIYW5kbGVyKFxuICAgIGVycm9yOiBFcnJvciwgcmVxdWVzdDogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzcG9uc2VPclNvY2tldDogaHR0cC5TZXJ2ZXJSZXNwb25zZXxuZXQuU29ja2V0KSB7XG4gIGxvZ2dpbmcuZ2V0TG9nZ2VyKCkuZXJyb3IoYFJldmVyc2UgcHJveHkgZXJyb3IgZm9yICR7cmVxdWVzdC51cmx9OiAke2Vycm9yfWApO1xuICBpZiAocmVzcG9uc2VPclNvY2tldCBpbnN0YW5jZW9mIGh0dHAuU2VydmVyUmVzcG9uc2UpIHtcbiAgICByZXNwb25zZU9yU29ja2V0LndyaXRlSGVhZCg1MDAsICdSZXZlcnNlIFByb3h5IEVycm9yLicpO1xuICB9XG4gIHJlc3BvbnNlT3JTb2NrZXQuZW5kKCk7XG59XG5cbi8qKlxuICogR2V0IHBvcnQgZnJvbSByZXF1ZXN0LiBJZiB0aGUgcmVxdWVzdCBzaG91bGQgYmUgaGFuZGxlZCBieSByZXZlcnNlIHByb3h5LFxuICogcmV0dXJucyB0aGUgcG9ydC4gT3RoZXJ3aXNlLCByZXR1cm5zIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0UG9ydChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAocGF0aCkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhwYXRoKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hbMV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXG4gKiBIYW5kbGUgcmVxdWVzdCBieSBzZW5kaW5nIGl0IHRvIHRoZSBpbnRlcm5hbCBodHRwIGVuZHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVxdWVzdChcbiAgICByZXF1ZXN0OiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzcG9uc2U6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gICAgcG9ydDogbnVtYmVyKSB7XG4gIHJlcXVlc3QudXJsID0gcmVxdWVzdC51cmwhLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgbGV0IGhvc3QgPSAnbG9jYWxob3N0JztcbiAgaWYgKCdURVNUX1RNUERJUicgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICBob3N0ID0gJ1s6OjFdJzsgIC8vIEF2b2lkIEROUy5cbiAgfVxuICBjb25zdCB0YXJnZXQgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG5cbiAgcHJveHkud2ViKHJlcXVlc3QsIHJlc3BvbnNlLCB7dGFyZ2V0fSk7XG59XG5cbi8qKlxuICogSGFuZGxlIHJlcXVlc3QgYnkgc2VuZGluZyBpdCB0byB0aGUgaW50ZXJuYWwgd3MgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVVcGdyYWRlKFxuICAgIHJlcXVlc3Q6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCBzb2NrOiBuZXQuU29ja2V0LCBoZWFkOiBCdWZmZXIsXG4gICAgcG9ydDogbnVtYmVyKSB7XG4gIHJlcXVlc3QudXJsID0gcmVxdWVzdC51cmwhLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgbGV0IGhvc3QgPSAnbG9jYWxob3N0JztcbiAgaWYgKCdURVNUX1RNUERJUicgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICBob3N0ID0gJ1s6OjFdJzsgIC8vIEF2b2lkIEROUy5cbiAgfVxuICBjb25zdCB0YXJnZXQgPSBgd3M6Ly8ke2hvc3R9OiR7cG9ydH1gO1xuXG4gIHByb3h5LndzKHJlcXVlc3QsIHNvY2ssIGhlYWQsIHt0YXJnZXR9KTtcbn1cblxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KHNldHRpbmdzOiBBcHBTZXR0aW5ncykge1xuICBhcHBTZXR0aW5ncyA9IHNldHRpbmdzO1xuICBwcm94eS5vbignZXJyb3InLCBlcnJvckhhbmRsZXIpO1xufVxuIl19