2012-07-17 87 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

相關問題