{"id":50329104,"url":"https://github.com/luanzhu/roadrunner","last_synced_at":"2026-05-29T08:31:34.938Z","repository":{"id":57661392,"uuid":"90512615","full_name":"luanzhu/roadrunner","owner":"luanzhu","description":"A rust rest client based on hyper (https://github.com/hyperium/hyper).","archived":false,"fork":false,"pushed_at":"2017-06-26T03:12:43.000Z","size":25,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-03T10:59:00.953Z","etag":null,"topics":["hyper","rest","restclient","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luanzhu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-07T06:09:31.000Z","updated_at":"2018-06-10T20:53:29.000Z","dependencies_parsed_at":"2022-09-05T23:51:00.400Z","dependency_job_id":null,"html_url":"https://github.com/luanzhu/roadrunner","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/luanzhu/roadrunner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanzhu%2Froadrunner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanzhu%2Froadrunner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanzhu%2Froadrunner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanzhu%2Froadrunner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luanzhu","download_url":"https://codeload.github.com/luanzhu/roadrunner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luanzhu%2Froadrunner/sbom","scorecard":{"id":601554,"data":{"date":"2025-08-11","repo":{"name":"github.com/luanzhu/roadrunner","commit":"786c0c9f746c79d80d4eb94b74d2da99b17309e0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/13 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 5 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-21T00:34:18.590Z","repository_id":57661392,"created_at":"2025-08-21T00:34:18.591Z","updated_at":"2025-08-21T00:34:18.591Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33644186,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hyper","rest","restclient","rust"],"created_at":"2026-05-29T08:31:33.951Z","updated_at":"2026-05-29T08:31:34.932Z","avatar_url":"https://github.com/luanzhu.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Roadrunner (RR)\n\nRoadrunner is a Rust Rest client based on [hyper project](https://github.com/hyperium/hyper) to \nprovide an user friendly interface for use.\n\nThe API interface is partially inspired by [unirest java library](http://unirest.io/java.html).\n\n# Why?\n\nI recently started to look at rust and noticed the choice of rest client in rust seemed to be\nlimited. Hyper client and some libcurl bindings I tried seem to be pretty low level to me.\n\nAnother big reason is that writing a library (no matter how small it is) seems to be a good\nway to start a new language. :)\n\n# Documentation\n \n[Documentation generated by cargo doc](https://luanzhu.github.io/rust/doc/roadrunner/index.html).\n\n# Example\n\n(Besides the examples below, there is also a standalone example that uses RoadRunner client\nto call themoviedb.org for upcoming movies, check it out: [https://github.com/luanzhu/movie_alert](https://github.com/luanzhu/movie_alert))\n\nTo run the example below, add RoadRunner to your `Cargo.toml`:\n\n```toml\ntokio-core = \"0.1.6\"\nserde=\"1.0\"\nserde_json = \"1.0\"\nserde_derive=\"1.0\"\nhyper = \"0.11\"\n\nroadrunner = \"0.1.1\"\n```\n\nThen copy to your main.rs:\n\n```rust\n#[macro_use] extern crate serde_derive;\nextern crate tokio_core;\n\nextern crate serde_json;\nextern crate hyper;\nextern crate roadrunner;\n\n// need both RestClient and RestClientMethods\nuse roadrunner::RestClient;\nuse roadrunner::RestClientMethods;\n\nuse hyper::StatusCode;\nuse serde_json::Value;\n\n#[derive(Serialize, Deserialize, Debug, PartialEq)]\nstruct Address {\n    street: String,\n    city: String,\n}\n\nfn main () {\n    let mut core = tokio_core::reactor::Core::new().unwrap();\n\n    let original_typed = Address {\n        street: \"135 College View Ave.\".to_owned(),\n        city: \"San Francisco\".to_owned(),\n    };\n\n    let response = RestClient::post(\"http://mockbin.com/request\")\n        .cookie(\"food\", \"bar\")\n        .authorization_bearer(\"QWxhZGRpbjpvcGVuIHNlc2FtZQ\".to_string())\n        .json_body_typed(\u0026original_typed)\n        .execute_on(\u0026mut core)\n        .unwrap();\n\n    println!(\"{:?}\", response);\n\n    assert_eq!(*response.status(), StatusCode::Ok);\n\n    let json_value = response.content().as_value().unwrap();\n    assert_eq!(Value::String(\"application/json\".to_owned()),\n    json_value[\"headers\"][\"content-type\"]);\n\n    let data_str = json_value[\"postData\"][\"text\"].as_str().unwrap();\n\n    println!(\"data_str : {:?}\", data_str);\n\n    let response_typed: Address = serde_json::from_str(data_str).unwrap();\n    assert_eq!(original_typed, response_typed);\n}\n```\n\n# Usage\n\n## High level\n\nHigh level API access is provided through [`RestClient`](https://luanzhu.github.io/rust/doc/roadrunner/struct.RestClient.html) and methods available in trait\n[`RestClientMethods`](https://luanzhu.github.io/rust/doc/roadrunner/trait.RestClientMethods.html).\n\nPlease refer to tests in the tests folder for more example.\n\n## Low level\n\nFor more control of request configuration, please use [`request_for_response`](https://luanzhu.github.io/rust/doc/roadrunner/fn.request_for_response.html).  \n\nThe high level [`RestClient`](https://luanzhu.github.io/rust/doc/roadrunner/struct.RestClient.html) is\na thin layer on top of this function.\n\n# Supported Methods\n\n* GET\n* POST\n* PUT\n* PATCH\n* DELETE\n* OPTIONS\n\n# Run integration tests in tests folder?\n\nTo make tests self-contained, all integration tests are hitting local httpbin container (behind \na nginx container) in docker.\n\nPlease run the `start.sh` in the `docker-httpbin` folder to start two containers (one for httpbin and another one for nginx) locally\nbefore you run integration tests.\n\n**Warning**: because of [a recent regression\nin httpbin](https://github.com/kennethreitz/httpbin/issues/340), httpbin.org cannot see the request\nbody transferred in chunks.  Before the bug is fixed in httpbin, many tests will fail if they \nhit httpbin.org directly.\n\n## Add self-signed SSL cert into your CA\n\nHyper client relies on [rust-native-tls]((https://github.com/sfackler/rust-native-tls) to\nhandle https connections.  However, there is no easy option to allow self-signed certs yet.\nThere is [an open issue regarding this](https://github.com/sfackler/rust-native-tls/issues/13).\n\n(Why not use a hosted version of https endpoint for tests?  You may ask.  Well, I personally \nwould like to see what takes to work around this invalid certificate problem. I think it is \nfairly common to have self-signed certificates in testing environments. To me, this extra \nstep serves as an exercise when I use this rest client or hyper client in future projects.)\n\nAs a result, the self-signed cert used in docker (docker-httpbin/config/localhost.cert) has to\nbe set to trusted (or added to trusted CA store).  Otherwise, one test will fail.\n\n# References\n\nSome parts of implementations are based on ideas/examples from:\n\n* [Hyper client example](https://github.com/hyperium/hyper/blob/master/examples/client.rs)\n* [Get Data From A URL in Rust](http://hermanradtke.com/2015/09/21/get-data-from-a-url-rust.html)\n\n# Related\n\n* [hyper](https://github.com/hyperium/hyper)\n* [tokio-curl](https://github.com/tokio-rs/tokio-curl)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluanzhu%2Froadrunner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluanzhu%2Froadrunner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluanzhu%2Froadrunner/lists"}