Здравствуйте уважаемые,

в своём расширении использую nsIObserverService для отслеживания "http-on-examine-response" и получения HTTP-кодов от сервера. Всё прекрасно работает. Но - если сервер лежит, то, естественно, даже код 404 мы не получим - сервера-то нет.

Вопрос - как и в каком месте определять, что пользовательский запрос не выполнен из-за отсутствия ответа сервера?

Заранее спасибо!

AllSeeingI

Если через какой-то промежуток времени (time out) мы не получаем от сервера ответа вообще - считаем,  что он сдох.

Задача была решена через использование 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 ?

Anton
Err... да никак - нам этого вроде вообще делать не надо. Просто привязываем listener к браузеру через addProgressListener - и всё.

В первом сообщении упомянут http-on-examine-response. Аргументом у него nsIChannel. То есть мне интересно, как из nsIChannel можно получить браузер, который его создал, чтобы потом "повесить" на него nsIWebProgressListener. Или, итоговое решение уже без http-on-examine-response ?

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

Маленькое замечание: observer и listener мы используем независимо, т.е. observer привязывается к gBrowser (и оттуда вытягиваем tab/browser, из которого вышел запрос), а listener привязываем к gBrowser.selectedBrowser (или любому другому конкретному браузеру). Мы не привязываем listener изнутри observer'а - если сервер недоступен, то вы туда просто не попадёте.

Мы не привязываем listener изнутри observer'а - если сервер недоступен, то вы туда просто не попадёте.

Ну, может быть получится "привязаться" к браузеру по http-on-modify-request.