Firefox: проблема с состоянием в OnStateChange в среде Proxy - PullRequest
0 голосов
/ 14 сентября 2011

Я пытаюсь использовать статус, чтобы увидеть, есть ли ошибка в компоненте C ++ XPCOM в моем классе наблюдателя на Mac.

OnStateChange(
   nsIWebProgress *aWebProgress,
   nsIRequest *aRequest,
   PRUint32 aStateFlags,
   nsresult aStatus)
{

}

В прокси-среде параметр aStatus всегда равен true, хотябраузер не может загрузить страницу.

В непрокси-среде он дает правильное значение (ошибку) в статусе.

Вы можете увидеть его, если попытаетесь получить доступ к http://10.1.3.3/ (какой-то случайный IP).С прокси статус равен нулю (успех), а без прокси вы получите значение ошибки.

Должны ли быть установлены некоторые параметры для получения правильного значения ошибки?

1 Ответ

1 голос
/ 14 сентября 2011

Это ожидаемое поведение, если вы используете HTTP-прокси.Ненулевое значение aStatus означает «не получен ответ из-за какой-либо ошибки».С другой стороны, нулевое значение aStatus означает «был какой-то ответ, проверьте nsIHttpChannel.responseStatus, чтобы увидеть, был ли запрос успешным».Вот что вы получите, если сервер ответит, например, «404 Not Found» - aStatus будет равно нулю (вы получили ответ), но nsIHttpChannel.responseStatus будет равно 404.

То же самое с HTTPпрокси, потому что прокси всегда будет отправлять ответ, вероятно, «502 Bad Gateway», если он не может подключиться к серверу.Вот что получает браузер, так что aStatus будет равно нулю, а nsIHttpChannel.responseStatus будет равно 502. Так что в своем коде вы должны сделать что-то вроде этого:

OnStateChange(
   nsIWebProgress *aWebProgress,
   nsIRequest *aRequest,
   PRUint32 aStateFlags,
   nsresult aStatus)
{
  if (FAILED(aStatus))
  {
    // Got no response
  }
  else
  {
    nsCOMPtr<nsIHttpChannel> channel = do_QueryInterface(aRequest);
    PRUint32 status = 0;
    if (channel)
      channel->GetResponseStatus(&status);
    if (status >= 400)
    {
      // Got an HTTP error
    }
    else
    {
      // Success!
    }
  }
}
...