• 11162阅读
  • 7回复

QWebView使用ISA代理(已解决) [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 倒序阅读 楼主  发表于: 2009-01-16
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
经过一段艰苦卓绝的跟踪查找,终于解决了。解决方法看6楼
==========================================2009-03-25分割线==========================================
QHttp能够很简单的使用ISA代理,很自然的可以认为QWebView也能够使用ISA代理。
不过经过一天的摸索,依然失败...
郁闷,而且自带的列子Browser也没有支持代理--代理功能没有实现。
-------
http://labs.trolltech.com/blogs/2007/11/24/one-more-piece-falling-into-place-network-access/

The next phase now is to make WebKit use this new infrastructure. The API will probably have a simple setManager() function that takes a QNetworkAccessManager object. When it needs more data from the network, it’ll simply call get() there.
-------
这上面说下一步的任务是为WebKit增加一个API函数setManager()
目前我打开网页的代码如下:
    QNetworkAccessManager * manager = new QNetworkAccessManager;
    manager->setProxy(QNetworkProxy::applicationProxy());
    frameWebBrowser.wvBrowser->page()->setNetworkAccessManager(manager);
    frameWebBrowser.wvBrowser->load(QUrl(frameWebBrowser.edtUrl->text()));
-------
报错:
UNEXPECTED RESPONSE: [HTTP/1.1 502 Proxy Error ( The specified Secure Sockets Layer (SSL) port is not allowed. ISA Server is not configured to allow SSL requests from this port. Most Web browsers use port 443 for SSL requests. )
Via: 1.1 XXXXXXXXX(ISA服务器名)
Connection: close
Proxy-Connection: close
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 700

]
-------
和SSL有啥关系啊,郁闷~
谁有好的建议,也欢迎
[ 此帖被wvins在2009-03-25 13:26重新编辑 ]
离线wvins
只看该作者 1楼 发表于: 2009-01-17
昨天把机器带回家,在没有代理的情况下使用发现我设置的ApplicationProxy确实起作用了。
可为什么在公司环境下不能访问网页呢?
(因为我把代理设置去掉就能在家正常访问网页,加上全局代理就无法打开网页)
设置ApplicationProxy的代码如下:

bool convert;
QNetworkProxy proxy(QNetworkProxy::HttpProxy,
    ConfigManager::instance()->value("ProxySettings","ProxyAddress",""),
    ConfigManager::instance()->value("ProxySettings","ProxyPort","").toInt(&convert,10),
    ConfigManager::instance()->value("ProxySettings","UserName",""),
    ConfigManager::instance()->value("ProxySettings","Password",""));
QNetworkProxy::setApplicationProxy(proxy);

不会真像错误提示的那样,需要加入SSL支持吧?
(目前对于SSL还仅仅是一知半解,至于Qt对SSL的支持所知就更少了)
-------------
既然设置ApplicationProxy有效果,
那么今天我就就看看ApplicationProxy在QtWebKit模块中处于什么位置吧。
离线wvins
只看该作者 2楼 发表于: 2009-01-17
继续顶
看到一段代码,真是莫名其妙,不熟悉复杂的模板用法看来还是不行啊

\QT4\src\3rdparty\webkit\WebCore\platform\network\ResourceHandle.h
Line 88

class ResourceHandle : public Shared<ResourceHandle>
注意,蓝色的两部分完全一样...
而且,这里的Shared是什么意思呢?
谁能帮忙解释一下?
---
附上一天的分析成果吧,
Visio 2003画的类图,只关注Load()函数的执行堆栈。

压缩后的Visio文件 QtWebKit.rar (109 K) 下载次数:14
--------
了解了Proxy的设置过程,可是怎么调用还不是很清楚,今天到此为止了。
修改过的类图 QtWebKit.rar (119 K) 下载次数:14

BTW:
Delphi提供直接修改控件源代码并编译连接的能力,
小弟我不才,请教各位怎么修改Qt源代码并编译连接到程序中去?
[ 此贴被wvins在2009-01-17 22:41重新编辑 ]
离线wvins
只看该作者 3楼 发表于: 2009-01-19
关于class ResourceHandle : public Shared<ResourceHandle> 的定义,大家可以参考一下两个链接:
http://www.builder.com.cn/2007/1019/567216.shtml
http://blog.csdn.net/xiaohyy/archive/2004/07/09/38079.aspx
比较绕,需要慢慢消化。

迟迟没有进展,真是有点急躁~
我在想是不是真的像错误信息报告的那样,和SSL有关呢?
可是同样使用 Http类型的Proxy,
QHttp就没这样的问题
QWebView就会有这样的问题呢?

哪位SSL的达人指点一下。
离线wvins
只看该作者 4楼 发表于: 2009-01-20
Google以下错误信息
"isa server is not configured to allow ssl requests from this port"
这样的错误通常是由于使用非标准的SSL端口(443)导致被ISA代理服务器屏蔽导致的

可我并没有使用https,(内部链接对象大概也不会有https的吧)
难道ISA不分青红皂白把http的80端口当成https处理了?

那应该是和SSL没什么关系了吧,
没办法,下一步记录下HTTP的交互过程吧,

目前我还不知道怎么记录,有过这方面经验的兄弟给点意见吧
离线wvins
只看该作者 5楼 发表于: 2009-01-21
还是缺乏风险控制啊
折腾了这么多天都没有搞得定,只能来年再搞了。
这几天要补补落下的工作才成。遗憾...
=====================

这段时间的折腾也不是完全没有收获,
终于知道怎么修改编译WebKit模块了,
其实也就是修改完WebKit的代码,再make 一遍Qt4就可以了。

说出来也很简单,不过对不知道的人应该会有点帮助。
make会判断有没有修改,仅对有修改的代码重新编译连接。
=====================
离线wvins
只看该作者 6楼 发表于: 2009-03-25
Visio 2003静态类图 QNetworkAccessManager.rar (281 K) 下载次数:13
一步步的跟踪代码,一次次的缩小问题的范围
最初认为是QWebView的问题,
然后根据返回信息认为和OpenSSL有关,
后来使用QNetworkAccessManager直接调用返回的错误信息一致,所以认为是QNetworkAccessManager导致的问题,
接着深入到QNetworkAccessManager的实现,发现是QAbstractSocket的问题,
然后比较QHttp和QNetworkAccessManager的Get方法的调试信息,
发现一个使用了QHttp连接代理服务器,然后直接发送Get命令,
但QNetworkAccessManager和代理服务器建立连接后,发送了Connect命令。

我才知道,在ISA后面是不能够Connect外网的Web服务器的,
ISA只负责转发Get和Post命令

------------------------------
详细跟踪代码发现,有一处判断代理类型的处理。
if (networkProxy.type() == QNetworkProxy::HttpCachingProxy && !encrypt) {
connectHost = networkProxy.hostName();
connectPort = networkProxy.port();
}
如果是HttpCachingProxy 类型的代理,则连接代理服务器,
而我使用的是HttpProxy.


我对代理服务器的认识太不充分...
------------------------------
附件是我分析过程中按我的习惯绘制的类结构,以供需要的朋友参考。
离线insion
只看该作者 7楼 发表于: 2011-10-26
#include <QtWebKit/QWebView>

#include <QtNetwork/QNetworkProxy>
#include <QtNetwork/QNetworkAccessManager>
#include <QSettings>
#include <QTextCodec>


class MainWindow : public QMainWindow

{
。。。
private:
Ui::MainWindow *ui;
QWebView *webV;
QNetworkProxy *proxy;
QNetworkAccessManager *netwkAcssMng;
};


mainwindow.cpp中也添加了代码:

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent), ui(new Ui::MainWindow)
{
。。。
webV = qFindChild<QWebView *>(this, "webView");

netwkAcssMng = new QNetworkAccessManager;

QNetworkProxy proxy;
proxy = QNetworkProxy::HttpProxy;
proxy.setHostName(tr("xx.xx.xx.xx")); //代理服务器
proxy.setPort(8080);
netwkAcssMng->setProxy(proxy);
webV->page()->setNetworkAccessManager(netwkAcssMng);
webV->load(QUrl("http://www.google.com.hk/"));
webV->show();
}


快速回复
限100 字节
 
上一个 下一个