barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 22 сентября 2016 г.

Msxml2.XMLHTTP: работа за проксёй в локальном скрипте

Итак, есть некий локальный JScript-скрипт, выполняемый на виндовой машине через cscript. В нем используется XHR-запрос, объект при этом создается следующим образом:
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
При этом соединение с нужным ресурсом выполняется по https. 
Все было в порядке, пока скрипт не был перенесен на другую машину, где при попытке загрузить XML по старому URL-у вдруг стала падать ошибка:
msxml3.dll: Security certificate required to access this resource is invalid
Ладно, предположим, что-то не так с SSL-сертификатом, хотя раньше проблем с ним не было. Переходим на объект Msxml2.ServerXMLHTTP и отключаем валидацию сертификатов:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP");
xmlhttp.setOption(2, 13056);
(почему 2 и 13056 - см. https://msdn.microsoft.com/en-us/library/ms763811(v=VS.85).aspx). Проблема с сертификатом пропала, зато теперь получаем:
msxml3.dll: The operation timed out
Идем дальше. меняем объект на Msxml2.ServerXMLHTTP.6.0, поддерживающий установку таймаутов:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
xmlhttp.setTimeouts(60000, 60000, 60000, 60000);
xmlhttp.setOption(2, 13056);
Однако, проблема продолжает воспроизводиться, по прошествии минуты падает таймаут, хотя загружаемый ресурс 100% доступен и отвечает за время в пределах 10сек. И тут возникает мысль, что "проблемная" машина сидит за прокси-сервером, пробуем:
var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
xmlhttp.setTimeouts(60000, 60000, 60000, 60000);
xmlhttp.setOption(2, 13056);
xmlhttp.setProxy(2, '<proxyhost>:<proxyport>','');
xmlhttp.open('GET', 'http://myurl', false);
xmlhttp.setProxyCredentials('<proxy_user>', '<proxy_password>');
Вуаля, проблема решена.

1 комментарий:

  1. Столкнулся с аналогичной ситуацией по части сертификатов, setOption помог - спасибо.

    ОтветитьУдалить