在我的桌面应用程序中,我使用boost :: asio添加了对各种互联网资源的访问。我所做的只是发送http请求(即映射tile服务器)并读取结果。 我的代码基于asio sync_client sample。如何添加代理支持boost :: asio?
现在我从无法使用这些功能的客户那里收到报告,因为他们在公司中运行代理。在网络浏览器中,他们可以输入他们的代理地址,一切都很好。我们的应用程序无法下载数据。
我该如何将这种支持添加到我的应用程序中?
在我的桌面应用程序中,我使用boost :: asio添加了对各种互联网资源的访问。我所做的只是发送http请求(即映射tile服务器)并读取结果。 我的代码基于asio sync_client sample。如何添加代理支持boost :: asio?
现在我从无法使用这些功能的客户那里收到报告,因为他们在公司中运行代理。在网络浏览器中,他们可以输入他们的代理地址,一切都很好。我们的应用程序无法下载数据。
我该如何将这种支持添加到我的应用程序中?
我自己找到了答案。这很简单:
http://www.jmarshall.com/easy/http/#proxies 给出了一个相当简短和清晰的描述HTTP代理如何工作。
我不得不做的是下面的代码添加到ASIO sync_client样品样本:
std::string myProxyServer = ...;
int myProxyPort = ...;
void doDownLoad(const std::string &in_server, const std::string &in_path, std::ostream &outstream)
{
std::string server = in_server;
std::string path = in_path;
char serice_port[255];
strcpy(serice_port, "http");
if(! myProxyServer.empty())
{
path = "http://" + in_server + in_path;
server = myProxyServer;
if(myProxyPort != 0)
sprintf(serice_port, "%d", myProxyPort);
}
tcp::resolver resolver(io_service);
tcp::resolver::query query(server, serice_port);
...
看来,样本仅仅是炫耀什么Boost ASIO可以使用,但可能不打算按原样使用。您可能应该使用完整的库,不仅可以处理HTTP代理,还可以使用HTTP重定向,压缩等。
HTTP是一件非常复杂的事情:如果不这样做,很有可能很快就会从另一个客户那里收到新消息的另一个问题。
我发现cppnetlib看起来很有前途,并且基于Boost ASIO不确定它是否处理代理。
还有libcurl但我不知道它是否可以轻松地与Boost ASIO集成。
好点,但我不需要处理重定向或意外的文件格式/压缩到目前为止。首先,我需要一个直接的代理解决方案。 – 2012-07-17 15:30:43
@REDSOFTADAIR:我认为最直接的想法就是阅读[this](http://www.w3.org/Protocols/rfc2616/rfc2616.html)并基本实现代理支持。幸运的是,解析HTTP标头并不困难。 – ereOn 2012-07-17 15:37:29
我不知道的boost :: ASIO支持'HTTP'。你自己实现了吗? – ereOn 2012-07-17 14:47:44
好吧,也许不是所有的http功能 - 看看链接的样本。 – 2012-07-17 15:00:55