>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Как определить что сервер недоступен? http://forum.mozilla-russia.org/viewtopic.php?id=22994 |
AllSeeingI > 06-05-2008 01:32:02 |
Здравствуйте уважаемые, в своём расширении использую nsIObserverService для отслеживания "http-on-examine-response" и получения HTTP-кодов от сервера. Всё прекрасно работает. Но - если сервер лежит, то, естественно, даже код 404 мы не получим - сервера-то нет. Вопрос - как и в каком месте определять, что пользовательский запрос не выполнен из-за отсутствия ответа сервера? Заранее спасибо! |
TLemur > 06-05-2008 07:07:19 |
AllSeeingI Если через какой-то промежуток времени (time out) мы не получаем от сервера ответа вообще - считаем, что он сдох. |
AllSeeingI > 11-05-2008 09:54:04 |
Задача была решена через использование Progress Listener'ов: Выделить код Код:onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { if(aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) { if(aStatus == 2152398878) // NS_ERROR_UNKNOWN_HOST { Если мы внутри последнего условия - сервер не ответил. |
Anton > 11-05-2008 14:03:57 |
AllSeeingI |
AllSeeingI > 12-05-2008 08:19:16 |
Anton |
Anton > 12-05-2008 14:13:12 |
В первом сообщении упомянут http-on-examine-response. Аргументом у него nsIChannel. То есть мне интересно, как из nsIChannel можно получить браузер, который его создал, чтобы потом "повесить" на него nsIWebProgressListener. Или, итоговое решение уже без http-on-examine-response ? |
AllSeeingI > 12-05-2008 20:17:28 |
Anton Ааа, понял. Всё очень просто: Выделить код Код:observe: function(aSubject, aTopic, aData) { if((aTopic == 'http-on-examine-response')) { try { var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); var interfaceReq = null; if(!httpChannel.notificationCallbacks) { if(httpChannel.loadGroup && httpChannel.loadGroup.notificationCallbacks) { interfaceReq = httpChannel.loadGroup.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor); } } else { interfaceReq = httpChannel.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor); } if(interfaceReq) { var doc = interfaceReq.getInterface(Components.interfaces.nsIDOMWindow).document; var index = gBrowser.getBrowserIndexForDocument(doc) if(index != -1) { // Браузер, стартовавший запрос: var browser = gBrowser.getBrowserForDocument(doc) |
Anton > 13-05-2008 10:07:39 |
Ясно, спасибо. |
AllSeeingI > 13-05-2008 13:37:25 |
Anton Маленькое замечание: observer и listener мы используем независимо, т.е. observer привязывается к gBrowser (и оттуда вытягиваем tab/browser, из которого вышел запрос), а listener привязываем к gBrowser.selectedBrowser (или любому другому конкретному браузеру). Мы не привязываем listener изнутри observer'а - если сервер недоступен, то вы туда просто не попадёте. |
Anton > 13-05-2008 14:04:45 |
Ну, может быть получится "привязаться" к браузеру по http-on-modify-request. |