Firefox:代理环境中 OnStateChange 状态出现问题

发布于 2024-12-04 15:28:43 字数 455 浏览 0 评论 0原文

我正在尝试使用状态来查看 Mac 上的观察者类中的 C++ XPCOM 组件是否存在错误。

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

}

在代理环境中,尽管浏览器无法加载页面,aStatus 参数始终为 true。

在非代理环境中,它会在状态中给出正确的值(错误)。

如果您尝试访问 http://10.1.3.3/ (一些随机 IP),您可以看到它。如果使用代理,状态为零(成功),如果没有代理,您会得到一个错误值。

是否应该设置一些参数以获得正确的误差值?

I am trying to use the status to see if there is an error in C++ XPCOM component in my observer class on Mac.

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

}

In proxy environment the aStatus parameter is always true though the browser fails to load the page.

In non-proxy environments it gives the proper value (error) in status.

You can see it if you try accessing http://10.1.3.3/ (some random IP). With a proxy the status is zero (success) and without a proxy you get an error value.

Should some parameters be set to get the proper error value?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

随波逐流 2024-12-11 15:28:43

如果您使用 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!
    }
  }
}

This is the expected behavior if you use an HTTP proxy. A non-zero aStatus means "didn't get any response because of some error". On the other hand, a zero aStatus value means "there was some response, check nsIHttpChannel.responseStatus to see whether the request was successful". That's what you get if the server responds with "404 Not Found" for example - aStatus will be zero (you got a response back) but nsIHttpChannel.responseStatus will be 404.

It's the same with an HTTP proxy because the proxy will always send a response back, probably "502 Bad Gateway" if it couldn't connect to the server. That's what the browser gets so aStatus will be zero and nsIHttpChannel.responseStatus will be 502. So in you code you should do something like this:

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!
    }
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文