在我的桌面應用程序中,我使用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