JavaScript
404
Вклад в тег
// Функция для совершения запросов:
function getText(link, timeout, options) {
// Возвращаем промис для удобства:
return new Promise(function(endPromise) {
// Конвертируем опции запроса в строку:
var bs64 = btoa(JSON.stringify(options));
// Прячем опции в хеше:
var uobj = new URL(link);
uobj.hash = '#rp:'+bs64;
var new_url = uobj.href;
// Создаем новое соединение:
var xhr = new XMLHttpRequest();
// Открываем соединение:
xhr.open('GET', new_url);
// Указываем таймаут:
xhr.timeout = timeout;
// Функция для обработки результата:
xhr.onreadystatechange = function() {
// Если запрос был полностью завершен:
if (xhr.readyState === XMLHttpRequest.DONE) {
// Если запрос успешный:
if (xhr.status === 200) {
// Возвращаем текст ответа:
endPromise(xhr.responseText);
}
// Если запрос не успешный:
else {
endPromise(false); // Возвращаем false
}
}
}
xhr.send(); // Отправляем запрос
});
}
// Обработчик для проксирования некоторых запросов:
browser.proxy.onRequest.addListener(function(request) {
// Считываем хеш из адреса запроса:
var hash = new URL(request.url)['hash'];
// Если хеш содержит
// параметры запроса:
if (/^#rp:/.test(hash)) {
// Получаем из хеша параметры запроса и расшифровываем:
var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
// Если в параметрах запроса есть прокси:
if (typeof options['proxy'] == 'object') {
// Используем эту прокси:
return options['proxy'];
}
// Если в опциях нет прокси:
else {
// Не используем прокси:
return { 'type': 'direct' };
}
}
// Если в хеше нет параметров:
else {
// Не используем прокси:
return { 'type': 'direct' };
}
}, { urls: [ '<all_urls>' ] });
// Обработчик для автоматической авторизация на http-прокси:
browser.webRequest.onAuthRequired.addListener(function(request) {
// Считываем хеш из адреса запроса:
var hash = new URL(request.url)['hash'];
// Если хеш содержит
// параметры запроса:
if (/^#rp:/.test(hash)) {
// Получаем из хеша параметры запроса и расшифровываем:
var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
// Если в параметрах запроса есть прокси:
if (typeof options['proxy'] == 'object') {
// Если в параметрах тип прокси http:
if (options['proxy']['type'] == 'http') {
// Отдаем логин с паролем для авторизации:
return {
'authCredentials': {
'username': options['proxy']['username'],
'password': options['proxy']['password']
}
};
}
}
}
}, { urls: [ '<all_urls>' ] }, [ 'blocking' ]);
// Обработчик для редактирования исходящих заголовков в запросах:
browser.webRequest.onBeforeSendHeaders.addListener(function(request) {
// Считываем хеш из адреса запроса:
var hash = new URL(request.url)['hash'];
// Если хеш содержит
// параметры запроса:
if (/^#rp:/.test(hash)) {
// Получаем из хеша параметры запроса и расшифровываем:
var options = JSON.parse(atob(hash.replace(/^#rp:/, '')));
// Берём массив заголовков запроса:
var headers = request.requestHeaders;
// Перебираем заголовки в обратном порядке:
for (var n = headers.length - 1; n >= 0; n--) {
// Вытаскиваем название текущего заголовка:
var header = headers[n].name.toLowerCase();
// Если текущий заголовок это Origin, Referer или Cookie:
if (header == 'origin' || header == 'referer' || header == 'cookie') {
// Удаляем заголовок:
headers.splice(n, 1);
}
}
// Если передан Origin:
if (options['origin']) {
// Добавляем заголовок Origin в массив заголовков запроса:
headers.push({ name: 'Origin', value: options['origin'] });
}
// Если передан Referer:
if (options['referer']) {
// Добавляем заголовок Referer в массив заголовков запроса:
headers.push({ name: 'Referer', value: options['referer'] });
}
// Если передан Cookie:
if (options['cookie']) {
// Добавляем заголовок Cookie в массив заголовков запроса:
headers.push({ name: 'Cookie', value: options['cookie'] });
}
// Возвращаем изменённый
// массив заголовок запроса:
return {requestHeaders: headers};
}
}, {urls: [ '<all_urls>' ] }, [ 'blocking', 'requestHeaders' ]);
// Обработчик для редактирования входящих заголовков:
browser.webRequest.onHeadersReceived.addListener(function(request) {
// Считываем хеш из адреса запроса:
var hash = new URL(request.url)['hash'];
// Если хеш содержит
// параметры запроса:
if (/^#rp:/.test(hash)) {
// Берём массив заголовков запроса:
var headers = request.responseHeaders;
// Перебираем заголовки в обратном порядке:
for (var n = headers.length - 1; n >= 0; n--) {
// Вытаскиваем название текущего заголовка:
var header = headers[n].name.toLowerCase();
// Если это установка куков:
if (header == 'set-cookie') {
// Удаляем заголовок:
headers.splice(n, 1);
}
}
// Добавляем заголовок, что ответ должен быть доступен всем:
headers.push({ name: 'Access-Control-Allow-Origin', value: '*' });
// Возвращаем изменённый
// массив заголовок запроса:
return {responseHeaders: headers};
}
}, { urls: [ '<all_urls>' ] }, [ 'blocking', 'responseHeaders' ]);
await getText('https://yandex.ru', 60000, {
'proxy': {
'type': 'socks',
'host': '185.38.84.111',
'port': '65234',
'username': 'тут_логин',
'password': 'тут_пароль'
},
'origin': 'https://yandex.ru',
'referer': 'https://yandex.ru/test',
'cookie': 'test1=123; iii=ooo'
});
await getText('https://yandex.ru', 60000, {
'proxy': {
'type': 'http',
'host': '185.38.84.111',
'port': '65233',
'username': 'тут_логин',
'password': 'тут_пароль'
},
'origin': 'https://yandex.ru',
'referer': 'https://yandex.ru/test',
'cookie': 'test1=123; iii=ooo'
});