如何在http代理后面使用ftp url下载文件

时间:2012-11-13 09:31:27

标签: c++ qt proxy network-programming qt4

我在http / https代理后面。因此,要使用QNetworkAccessManager下载文件,我将代理设置如下:

    if(no_proxy)
    {
        QNetworkProxyFactory::setUseSystemConfiguration (false);
        QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy);
    }
    else if(system_proxy)
    {
        QNetworkProxyQuery pQuery(QUrl(QLatin1String("http://www.google.com")));
        QList<QNetworkProxy>listOfProxies =QNetworkProxyFactory::systemProxyForQuery(pQuery);
        QNetworkProxy::setApplicationProxy(listOfProxies.first());
    }
    else if(manual_proxy)
    {
        proxy.setHostName(address);
        proxy.setPort(port);
        if(http_proxy)
            proxy.setType(QNetworkProxy::HttpProxy);
        else if(socks_proxy)
            proxy.setType(QNetworkProxy::Socks5Proxy);
        else if(ftp_proxy)
            proxy.setType(QNetworkProxy::FtpCachingProxy);
        QNetworkProxy::setApplicationProxy(proxy);
    }

现在支持http squid代理服务器,这个代码在http urls的情况下工作正常。但是,如果我尝试使用ftp url下载文件,则下载失败并显示错误

no suitable proxy found

似乎没有为ftp网址使用http代理。但是,我们有像firefox这样的选项:

use this proxy server for all protocols

如何在Qt中做类似的事情!

更新

void DownloadThread::startDownload()

{     QString args = downUrl,tempFN;

QUrl url = QUrl::fromEncoded(args.toLocal8Bit());

request.setUrl(url);
request.setRawHeader("User-Agent", userAgent);
request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true);
reply.setCookieJar(cookieJar);
reply=manager.get(request);
connect(reply, SIGNAL(readyRead()),this,
            SLOT(saveToDisk()));
...

}

1 个答案:

答案 0 :(得分:0)

您是否尝试过明确设置Qftp代理?

int setProxy ( const QString & host, quint16 port )

这可能会让您感到更高兴,但是,您必须正常为每个连接设置代理,但是,您尝试使用的代理总是有可能不支持FTP吗?如果您向我传递了有关代理的更多详细信息以及您的问题所在(例如请求/响应代码)

同样在squid.conf中可能想要更改/添加以下内容以防它们不存在

acl SSL_ports port 443 21
acl FTP proto FTP
always_direct allow FTP
http_access allow ftp

另外,值得检查防火墙允许端口20,21&amp; 443 (我知道这是一个简单的检查,但我常常发现这些东西可能是一个真正的痛苦,找到根本原因。)

您是否拥有生成的日志文件的副本?查看返回的错误代码会很有趣/有帮助。此外,您是否尝试手动单步执行程序以查看运行时变量中包含的内容,这样可以更好地了解正在发生的事情,因为可能一切都很好并且有一种简单的方法进展变量的内容将导致您在短时间内(可能不是这种情况,但通常值得一试)。