summaryrefslogtreecommitdiff
path: root/libproxy/modules/pacrunner_duktape.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libproxy/modules/pacrunner_duktape.cpp')
-rw-r--r--libproxy/modules/pacrunner_duktape.cpp149
1 files changed, 0 insertions, 149 deletions
diff --git a/libproxy/modules/pacrunner_duktape.cpp b/libproxy/modules/pacrunner_duktape.cpp
deleted file mode 100644
index a32d946..0000000
--- a/libproxy/modules/pacrunner_duktape.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * libproxy - A library for proxy configuration
- * Copyright (C) 2006 Nathaniel McCallum <nathaniel@natemccallum.com>
- * Copyright (C) 2021 Zhaofeng Li <hello@zhaofeng.li>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- ******************************************************************************/
-
-#include "../extension_pacrunner.hpp"
-#ifndef WIN32
-#include <unistd.h> // gethostname
-#endif
-
-using namespace libproxy;
-
-#include <duktape.h>
-#include "pacutils.h"
-
-static duk_ret_t dnsResolve(duk_context *ctx) {
- if (duk_get_top(ctx) != 1) {
- // Invalid number of arguments
- return 0;
- }
-
- // We do not need to free the string - It's managed by Duktape.
- const char *hostname = duk_get_string(ctx, 0);
- if (!hostname) {
- return 0;
- }
-
- // Look it up
- struct addrinfo *info;
- if (getaddrinfo(hostname, NULL, NULL, &info)) {
- return 0;
- }
-
- // Try for IPv4
- char tmp[INET6_ADDRSTRLEN+1];
- if (getnameinfo(info->ai_addr, info->ai_addrlen,
- tmp, INET6_ADDRSTRLEN+1,
- NULL, 0,
- NI_NUMERICHOST)) {
- freeaddrinfo(info);
- duk_push_null(ctx);
- return 1;
- }
- freeaddrinfo(info);
-
- // Create the return value
- duk_push_string(ctx, tmp);
- return 1;
-}
-
-static duk_ret_t myIpAddress(duk_context *ctx) {
- char hostname[1024];
- hostname[sizeof(hostname) - 1] = '\0';
-
- if (!gethostname(hostname, sizeof(hostname) - 1)) {
- duk_push_string(ctx, hostname);
- return dnsResolve(ctx);
- }
-
- return duk_error(ctx, DUK_ERR_ERROR, "Unable to find hostname!");
-}
-
-class duktape_pacrunner : public pacrunner {
-public:
- duktape_pacrunner(string pac, const url& pacurl) : pacrunner(pac, pacurl) {
-#ifdef WIN32
- // On windows, we need to initialize the winsock dll first.
- WSADATA WsaData;
- WSAStartup(MAKEWORD(2, 0), &WsaData);
-#endif
- this->ctx = duk_create_heap_default();
- if (!this->ctx) goto error;
- duk_push_c_function(this->ctx, dnsResolve, 1);
- duk_put_global_string(this->ctx, "dnsResolve");
-
- duk_push_c_function(this->ctx, myIpAddress, 1);
- duk_put_global_string(this->ctx, "myIpAddress");
-
- // Add other routines
- duk_push_string(this->ctx, JAVASCRIPT_ROUTINES);
- if (duk_peval_noresult(this->ctx)) {
- goto error;
- }
-
- // Add the PAC into the context
- duk_push_string(this->ctx, pac.c_str());
- if (duk_peval_noresult(this->ctx)) {
- goto error;
- }
-
- return;
- error:
- duk_destroy_heap(this->ctx);
- throw bad_alloc();
- }
-
- ~duktape_pacrunner() {
- duk_destroy_heap(this->ctx);
-#ifdef WIN32
- WSACleanup();
-#endif
- }
-
- string run(const url& url_) override {
- string url = url_.to_string();
- string host = url_.get_host();
-
- duk_get_global_string(this->ctx, "FindProxyForURL");
- duk_push_string(this->ctx, url.c_str());
- duk_push_string(this->ctx, host.c_str());
- duk_int_t result = duk_pcall(this->ctx, 2);
-
- if (result == 0) {
- // Success
- const char *proxy = duk_get_string(this->ctx, 0);
- if (!proxy) {
- duk_pop(this->ctx);
- return "";
- }
- string proxyString = string(proxy);
- duk_pop(this->ctx);
- return proxyString;
- } else {
- // Something happened. The top of the stack is an error.
- duk_pop(this->ctx);
- return "";
- }
- }
-
-private:
- duk_context *ctx;
-};
-
-PX_PACRUNNER_MODULE_EZ(duktape, "duk_create_heap_default", "duktape");