Hashmania
Blog

Code by Hashmania


Solicitudes http a través de proxy con Rust


En este artículo vamos a crear un sencillo programa en Rust para hacernos una idea básica de cómo podemos incluir librerías (crates) en nuestros programas de Rust. Como ejemplo haremos un programa que realizará peticiones http a través de un proxy.

Si estás familiarizado con Curl haremos lo mismo que si usaramos el comando curl -v https://www.google.es, pero además realizaremos la petición a través de un tercero para que nuestra ip no quede registrada en el servidor al que hacemos la petición. El resultado será simplemente mostrar encabezado de la solicitud, que nos dirá el tipo de servidor, seguridad, etc., y la respuesta con el html de la página.

Lo primero que tenemos que hacer en nuestro proyecto es agregar las dependencias necesarias, para ello editaremos el archivo Cargo.toml, esto puede tardar bastante tiempo porque primero tendrá que descargar todas las crates.

[dependencies]
reqwest = "0.11.0"
tokio = { version = "1.1.1", features = ["full"] }

A continuación escribiremos nuestro programa en nuestro archivo main.rs.

*Nota: puedes copiar los scripts con la indentación correcta haciendo click en COPY, en la esquina superior derecha de cada script.

extern crate reqwest;
use std::io;
use std::io::Write;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    println!("***Petición http a través de Proxy***");
    println!("Este programa mostrará el status, headers y el body de la url introducida.");
    println!("Puedes consultar una lista de proxys en: https://hidemy.name/es/proxy-list/");
    println!("No olvides poner http:// o https:// si no quieres obtener un error!\n\n");
    println!("Introduce una URL: ");
    let mut input = String::new();
    io::stdin().read_line(&mut input).ok().expect("Error de lectura");
    
    println!("\nIntroduce un PROXY: ");
    let mut input_proxy = String::new();
    io::stdin().read_line(&mut input_proxy).ok().expect("Error de lectura");
    
    let proxy = reqwest::Proxy::all(input_proxy.trim()).unwrap();
    let client = reqwest::Client::builder()
        .proxy(proxy)
        .build().unwrap();
    
    let res = client.get(input.trim()).send().await?;

    println!("Status: {}", res.status());
    println!("Headers:\n{:#?}", res.headers());

    let body = res.text().await?;
    println!("Body:\n{}", body);
    let mut file = std::fs::File::create("web.html").expect("Fallo de archivo");
    file.write_all(body.as_bytes()).expect("Fallo de escritura");

    println!("***PULSA ENTER PARA SALIR***");
    let mut salir = String::new();
    io::stdin().read_line(&mut salir).ok().expect("Error de lectura");
    println!("Bye bye!! {}",input.trim());
    Ok(())
}

Para comprobar nuestro código podemos simplemente compilar y ejecutar con cargo run. Si estamos seguros de que el resultado es el deseado podemos compilar en modo release para tener las optimizaciones necesarias para distribuir ya nuestro programa, para ello podemos ejecutar cargo build --release.

Si deseas conocer algo más acerca del lenguaje Rust puedes consultar Rust Para Neófitos.