2012-07-17 9 views
7

Trong ứng dụng máy tính để bàn của tôi, tôi đã thêm quyền truy cập vào các tài nguyên internet khác nhau bằng cách sử dụng boost :: asio. Tất cả những gì tôi làm là gửi các yêu cầu http (tức là tới các máy chủ bản đồ) và đọc kết quả. Mã của tôi dựa trên số asio sync_client sample.cách thêm hỗ trợ proxy để tăng :: asio?

Bây giờ tôi nhận được báo cáo từ khách hàng không thể sử dụng các chức năng này khi họ đang chạy proxy trong công ty của họ. Trong trình duyệt web, họ có thể nhập địa chỉ proxy của họ và mọi thứ đều ổn. Ứng dụng của chúng tôi không thể tải xuống dữ liệu.

Làm cách nào để thêm hỗ trợ đó vào ứng dụng của tôi?

+0

Tôi không biết Boost :: ASIO hỗ trợ 'HTTP'. Bạn đã tự thực hiện điều này chưa? – ereOn

+0

Vâng, có thể không phải tất cả các tính năng http - hãy xem mẫu được liên kết. –

Trả lời

5

Tôi tự tìm thấy câu trả lời. Nó khá đơn giản:

http://www.jmarshall.com/easy/http/#proxies cung cấp mô tả ngắn gọn và rõ ràng cách thức hoạt động của proxy http.

Tất cả tôi đã phải làm là thêm đoạn mã sau vào mẫu mẫu sync_client ASIO:

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

Dường như mẫu chỉ đơn giản là một sự phô trương của những gì Boost ASIO có thể được sử dụng cho nhưng có thể không có ý định được sử dụng như là. Có lẽ bạn nên sử dụng một thư viện hoàn chỉnh không chỉ xử lý các proxy HTTP, mà còn xử lý các chuyển hướng HTTP, nén, v.v.

HTTP là một điều phức tạp: mà không làm như vậy, rất có thể là cao mà bạn sẽ nhận được tin tức từ một khách hàng khác sớm với một vấn đề khác.

Tôi đã tìm thấy cppnetlib có vẻ đầy hứa hẹn và dựa trên Boost ASIO không chắc chắn rằng nó xử lý proxy.

Ngoài ra còn có libcurl nhưng tôi không biết liệu nó có thể dễ dàng được tích hợp với Boost ASIO hay không.

+0

Điểm tốt, nhưng tôi không cần phải xử lý chuyển hướng hoặc định dạng tệp không mong muốn/nén cho đến thời điểm này. Đầu tiên tôi cần một giải pháp thẳng cho proxy. –

+0

@ REDSOFTADAIR: Suy nghĩ thẳng thắn nhất mà tôi có thể nghĩ là đọc [this] (http://www.w3.org/Protocols/rfc2616/rfc2616.html) và thực hiện về cơ bản hỗ trợ proxy. May mắn thay, phân tích cú pháp tiêu đề HTTP không quá khó. – ereOn