• # Version Rust

    Posté par (site web personnel, Mastodon) . En réponse au journal Java : presque 9 000 requêtes par seconde avec 8 Mo de RAM. Évalué à 4.

    Voici ma version Rust (je ne suis pas un expert). On a moins de librairies disponible dans le "core", il m'a donc semblé juste d'utiliser des dépendances.

    #![deny(warnings)]
    usestd::convert::Infallible;
    userand::Rng;
    usehyper::service::{make_service_fn,service_fn};
    usehyper::{Body,Method,Request,Response,Server,StatusCode};
    asyncfn random_fox(req: Request<Body>)-> Result<Response<Body>,Infallible>{
    match(req.method(),req.uri().path()){
    (&Method::GET,"/")=>{
    letmutrandomGenerator=rand::thread_rng();
    letimgCount=20;
    letrndInt=randomGenerator.gen_range(1..imgCount);
    letrndStr=rndInt.to_string();
    leturl="https://avatar.spacefox.fr/Renard-".to_owned()+&rndStr+".png";
    letset_location=Response::builder()
    .header(hyper::header::LOCATION,url)
    .status(StatusCode::MOVED_PERMANENTLY)
    .body(Body::from("")).unwrap();
    Ok(set_location)
    },
    // Return the 404 Not Found for other routes.
    _=>{
    letmutnot_found=Response::default();
    *not_found.status_mut()=StatusCode::NOT_FOUND;
    Ok(not_found)
    }
    }
    }
    #[tokio::main]
    pubasyncfn main()-> Result<(),Box<dynstd::error::Error+Send+Sync>>{
    letport=std::env::args().nth(1).expect("no port given")
    .parse::<u16>().unwrap();
    let_imgCount:u16 =std::env::args().nth(2).expect("no imgCount given")
    .parse::<u16>().unwrap();
    pretty_env_logger::init();
    letmake_svc=make_service_fn(|_conn|{
    async{Ok::<_,Infallible>(service_fn(|req|random_fox(req)))}
    });
    letaddr=([127,0,0,1],port).into();
    letserver=Server::bind(&addr).serve(make_svc);
    println!("Listening on http://{}",addr);
    server.await?;
    Ok(())
    }

    Et le Cargo.toml
    ```ini
    [package]
    name = "random_url_server"
    version = "0.1.0"
    edition = "2021"

    [dependencies]
    hyper = { version = "0.14", features = ["full"] }
    tokio = { version = "1", features = ["full"] }
    rand = { version = "*"}
    pretty_env_logger = "0.4"
    ```

    Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.