2012-07-17 147 views
7

在我的桌面应用程序中,我使用boost :: asio添加了对各种互联网资源的访问。我所做的只是发送http请求(即映射tile服务器)并读取结果。 我的代码基于asio sync_client sample如何添加代理支持boost :: asio?

现在我从无法使用这些功能的客户那里收到报告,因为他们在公司中运行代理。在网络浏览器中,他们可以输入他们的代理地址,一切都很好。我们的应用程序无法下载数据。

我该如何将这种支持添加到我的应用程序中?

+0

我不知道的boost :: ASIO支持'HTTP'。你自己实现了吗? – ereOn 2012-07-17 14:47:44

+0

好吧,也许不是所有的http功能 - 看看链接的样本。 – 2012-07-17 15:00:55

回答

5

我自己找到了答案。这很简单:

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); 

... 
2

看来,样本仅仅是炫耀什么Boost ASIO可以使用,但可能不打算按原样使用。您可能应该使用完整的库,不仅可以处理HTTP代理,还可以使用HTTP重定向,压缩等。

HTTP是一件非常复杂的事情:如果不这样做,很有可能很快就会从另一个客户那里收到新消息的另一个问题。

我发现cppnetlib看起来很有前途,并且基于Boost ASIO不确定它是否处理代理。

还有libcurl但我不知道它是否可以轻松地与Boost ASIO集成。

+0

好点,但我不需要处理重定向或意外的文件格式/压缩到目前为止。首先,我需要一个直接的代理解决方案。 – 2012-07-17 15:30:43

+0

@REDSOFTADAIR:我认为最直接的想法就是阅读[this](http://www.w3.org/Protocols/rfc2616/rfc2616.html)并基本实现代理支持。幸运的是,解析HTTP标头并不困难。 – ereOn 2012-07-17 15:37:29

相关问题