2012-07-17 16 views
7

En mi aplicación de escritorio, agregué acceso a varios recursos de internet usando boost :: asio. Todo lo que hago es enviar solicitudes http (es decir, asignar servidores de mosaico) y leer los resultados. Mi código está basado en el asio sync_client sample.cómo agregar soporte proxy para impulsar :: asio?

Ahora recibo informes de clientes que no pueden usar estas funciones ya que están ejecutando un proxy en su empresa. En un navegador web, pueden ingresar la dirección de su proxy y todo está bien. Nuestra aplicación no puede descargar datos.

¿Cómo puedo agregar tal soporte a mi aplicación?

+0

yo no era consciente de Boost :: asio apoyado 'HTTP'. ¿Has implementado esto tú mismo? – ereOn

+0

Bueno, tal vez no todas las características http: eche un vistazo a la muestra vinculada. –

Respuesta

5

Encontré la respuesta yo mismo. Es bastante simple:

http://www.jmarshall.com/easy/http/#proxies ofrece una descripción bastante breve y clara de cómo funcionan los proxies http.

todo lo que tenía que hacer es añadir el siguiente código a la muestra de 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

Parece que la muestra es simplemente un alarde de lo que Boost ASIO se puede utilizar, pero es probable que no esté destinado a ser utilizado tal cual. Probablemente debería usar una biblioteca completa que maneje no solo proxies HTTP, sino también redireccionamientos HTTP, compresión, etc.

HTTP es algo complejo: sin hacerlo, es muy probable que reciba noticias de otro cliente pronto con otro problema.

Encontré cppnetlib que parece prometedor y está basado en Boost ASIO, aunque no estoy seguro de que maneje los proxies. También hay libcurl pero no sé si se puede integrar fácilmente con Boost ASIO.

+0

Buen punto, pero no necesito manejar redirecciones o formatos de archivo inesperados/compresión hasta el momento. Primero necesito una solución directa para proxies. –

+0

@REDSOFTADAIR: Creo que lo más directo que puedo es leer [esto] (http://www.w3.org/Protocols/rfc2616/rfc2616.html) e implementar básicamente el soporte de proxy. Afortunadamente, analizar encabezados HTTP no es tan difícil. – ereOn

Cuestiones relacionadas