Страницы: 1
Здравствуйте уважаемые,
в своём расширении использую nsIObserverService для отслеживания "http-on-examine-response" и получения HTTP-кодов от сервера. Всё прекрасно работает. Но - если сервер лежит, то, естественно, даже код 404 мы не получим - сервера-то нет.
Вопрос - как и в каком месте определять, что пользовательский запрос не выполнен из-за отсутствия ответа сервера?
Заранее спасибо!
Отсутствует
Задача была решена через использование Progress Listener'ов:
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { if(aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP) { if(aStatus == 2152398878) // NS_ERROR_UNKNOWN_HOST {
Если мы внутри последнего условия - сервер не ответил.
Отсутствует
AllSeeingI
А как был привязан nsIWebProgressListener к nsIChannel ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
Err... да никак - нам этого вроде вообще делать не надо. Просто привязываем listener к браузеру через addProgressListener - и всё.
Отсутствует
В первом сообщении упомянут http-on-examine-response. Аргументом у него nsIChannel. То есть мне интересно, как из nsIChannel можно получить браузер, который его создал, чтобы потом "повесить" на него nsIWebProgressListener. Или, итоговое решение уже без http-on-examine-response ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
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)
Отредактировано AllSeeingI (12-05-2008 20:18:21)
Отсутствует
Anton
Маленькое замечание: observer и listener мы используем независимо, т.е. observer привязывается к gBrowser (и оттуда вытягиваем tab/browser, из которого вышел запрос), а listener привязываем к gBrowser.selectedBrowser (или любому другому конкретному браузеру). Мы не привязываем listener изнутри observer'а - если сервер недоступен, то вы туда просто не попадёте.
Отсутствует
Мы не привязываем listener изнутри observer'а - если сервер недоступен, то вы туда просто не попадёте.
Ну, может быть получится "привязаться" к браузеру по http-on-modify-request.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Страницы: 1