123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- "use strict";
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- const http = require("http");
- const url = require("url");
- const webdriver_commands_1 = require("./webdriver_commands");
- /**
- * A proxy that understands WebDriver commands. Users can add barriers (similar to middleware in
- * express) that will be called before forwarding the request to WebDriver. The proxy will wait for
- * each barrier to finish, calling them in the order in which they were added.
- */
- class WebDriverProxy {
- constructor(seleniumAddress) {
- this.barriers = [];
- this.seleniumAddress = seleniumAddress;
- }
- addBarrier(barrier) {
- this.barriers.push(barrier);
- }
- handleRequest(originalRequest, response) {
- return __awaiter(this, void 0, void 0, function* () {
- let command = webdriver_commands_1.parseWebDriverCommand(originalRequest.url, originalRequest.method);
- let replyWithError = (err) => {
- response.writeHead(502);
- if (err && err.toString) {
- response.write(err.toString());
- }
- response.end();
- };
- // Process barriers in order, one at a time.
- try {
- for (let barrier of this.barriers) {
- yield barrier.onCommand(command);
- }
- }
- catch (err) {
- replyWithError(err);
- // Don't call through if a barrier fails.
- return;
- }
- let parsedUrl = url.parse(this.seleniumAddress);
- let options = {};
- options.method = originalRequest.method;
- options.path = parsedUrl.path + originalRequest.url;
- options.hostname = parsedUrl.hostname;
- options.port = parseInt(parsedUrl.port);
- options.headers = originalRequest.headers;
- let forwardedRequest = http.request(options);
- // clang-format off
- let reqData = '';
- originalRequest.on('data', (d) => {
- reqData += d;
- forwardedRequest.write(d);
- }).on('end', () => {
- command.handleData(reqData);
- forwardedRequest.end();
- }).on('error', replyWithError);
- forwardedRequest.on('response', (seleniumResponse) => {
- response.writeHead(seleniumResponse.statusCode, seleniumResponse.headers);
- let respData = '';
- seleniumResponse.on('data', (d) => {
- respData += d;
- response.write(d);
- }).on('end', () => {
- command.handleResponse(seleniumResponse.statusCode, respData);
- response.end();
- }).on('error', replyWithError);
- }).on('error', replyWithError);
- // clang-format on
- });
- }
- }
- exports.WebDriverProxy = WebDriverProxy;
- //# sourceMappingURL=webdriver_proxy.js.map
|