{"id":13580422,"url":"https://github.com/sagebind/isahc","last_synced_at":"2025-12-12T14:48:49.278Z","repository":{"id":37664896,"uuid":"106773441","full_name":"sagebind/isahc","owner":"sagebind","description":"The practical HTTP client that is fun to use.","archived":false,"fork":false,"pushed_at":"2024-07-05T11:52:53.000Z","size":9961,"stargazers_count":758,"open_issues_count":57,"forks_count":67,"subscribers_count":6,"default_branch":"1.x","last_synced_at":"2025-10-18T05:57:22.001Z","etag":null,"topics":["hacktoberfest","http","http-client","http2","https","rust"],"latest_commit_sha":null,"homepage":"https://docs.rs/isahc","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/sagebind.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["sagebind"]}},"created_at":"2017-10-13T03:26:21.000Z","updated_at":"2025-09-30T03:25:33.000Z","dependencies_parsed_at":"2023-11-07T04:26:25.159Z","dependency_job_id":"7b13314b-8943-4f07-ab06-e9f036589e6e","html_url":"https://github.com/sagebind/isahc","commit_stats":{"total_commits":554,"total_committers":32,"mean_commits":17.3125,"dds":"0.15162454873646214","last_synced_commit":"096aff7b13f4ff5bb474fdc27bc30b297a2968f6"},"previous_names":["sagebind/chttp"],"tags_count":71,"template":false,"template_full_name":null,"purl":"pkg:github/sagebind/isahc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sagebind%2Fisahc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sagebind%2Fisahc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sagebind%2Fisahc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sagebind%2Fisahc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sagebind","download_url":"https://codeload.github.com/sagebind/isahc/tar.gz/refs/heads/1.x","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sagebind%2Fisahc/sbom","scorecard":{"id":794980,"data":{"date":"2025-08-11","repo":{"name":"github.com/sagebind/isahc","commit":"9d1edd475231ad5cfd5842d939db1382dc3a88f5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Code-Review","score":0,"reason":"Found 1/27 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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/configure-repo.yml:1","Warn: no topLevel permission defined: .github/workflows/psl-update.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-docs.yml:1","Warn: no topLevel permission defined: .github/workflows/release-management.yaml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/teto.yml:1","Info: no jobLevel write permissions found"],"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":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:88: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:107: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:135: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:141: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:147: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/ci.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/configure-repo.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/configure-repo.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/configure-repo.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/configure-repo.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/psl-update.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/psl-update.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/psl-update.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/psl-update.yml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-docs.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/publish-docs.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-docs.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/publish-docs.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-docs.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/publish-docs.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-management.yaml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/release-management.yaml/1.x?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/release.yml/1.x?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/teto.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/sagebind/isahc/teto.yml/1.x?enable=pin","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  12 third-party GitHubAction dependencies pinned"],"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":"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":"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":"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":"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":"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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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 12 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-23T08:40:26.582Z","repository_id":37664896,"created_at":"2025-08-23T08:40:26.582Z","updated_at":"2025-08-23T08:40:26.582Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27684650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-12T02:00:06.775Z","response_time":129,"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":["hacktoberfest","http","http-client","http2","https","rust"],"created_at":"2024-08-01T15:01:51.083Z","updated_at":"2025-12-12T14:48:49.247Z","avatar_url":"https://github.com/sagebind.png","language":"Rust","funding_links":["https://github.com/sponsors/sagebind"],"categories":["Rust","Programming Languages"],"sub_categories":["Rust"],"readme":"# Isahc\n\nSay hello to Isahc (pronounced like _Isaac_), the practical HTTP client that is fun to use.\n\n_Formerly known as [chttp]._\n\n[![Crates.io](https://img.shields.io/crates/v/isahc.svg)](https://crates.io/crates/isahc)\n[![Documentation](https://docs.rs/isahc/badge.svg)][documentation]\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Minimum supported Rust version](https://img.shields.io/badge/rustc-1.46+-yellow.svg)](#minimum-supported-rust-version)\n[![Crates.io downloads](https://img.shields.io/crates/d/isahc)](https://crates.io/crates/isahc)\n![Maintenance](https://img.shields.io/badge/maintenance-actively--developed-brightgreen.svg)\n[![Build](https://github.com/sagebind/isahc/workflows/ci/badge.svg)](https://github.com/sagebind/isahc/actions)\n[![codecov](https://codecov.io/gh/sagebind/isahc/branch/master/graph/badge.svg)](https://codecov.io/gh/sagebind/isahc)\n\n## Key features\n\n- Full support for HTTP/1.1 and HTTP/2.\n- Configurable request timeouts, redirect policies, Unix sockets, and many more settings.\n- Offers an ergonomic synchronous API as well as a runtime-agnostic asynchronous API with support for [async/await].\n- Fully asynchronous core, with incremental reading and writing of request and response bodies and connection multiplexing.\n- Sessions and cookie persistence.\n- Automatic request cancellation on drop.\n- Uses the [http] crate as an interface for requests and responses.\n\n\u003cimg src=\"media/isahc.svg.png\" width=\"320\" align=\"right\"\u003e\n\n## What is Isahc?\n\nIsahc is an acronym that stands for **I**ncredible **S**treaming **A**synchronous **H**TTP **C**lient, and as the name implies, is an asynchronous HTTP client for the [Rust] language. It uses [libcurl] as an HTTP engine inside, and provides an easy-to-use API on top that integrates with Rust idioms.\n\n### No, _who_ is Isahc?\n\nOh, you mean Isahc the dog! He's an adorable little Siberian husky who loves to play fetch with webservers every day and has a very _cURLy_ tail. He shares a name with the project and acts as the project's mascot.\n\nYou can pet him all day if you like, he doesn't mind. Though, he prefers it if you pet him in a standards-compliant way!\n\n## [Documentation]\n\nPlease check out the [documentation] for details on what Isahc can do and how to use it. To get you started, here is a really simple, complete example that spits out the response body from https://example.org:\n\n```rust\nuse isahc::prelude::*;\n\nfn main() -\u003e Result\u003c(), isahc::Error\u003e {\n    // Send a GET request and wait for the response headers.\n    // Must be `mut` so we can read the response body.\n    let mut response = isahc::get(\"https://example.org\")?;\n\n    // Print some basic info about the response to standard output.\n    println!(\"Status: {}\", response.status());\n    println!(\"Headers: {:#?}\", response.headers());\n\n    // Read the response body as text into a string and print it.\n    print!(\"{}\", response.text()?);\n\n    Ok(())\n}\n```\n\nClick [here][documentation] for documentation on the latest version. You can also click [here](https://sagebind.github.io/isahc/isahc/) for built documentation from the latest unreleased `master` build.\n\n## Getting help\n\nNeed some help with something Isahc-related? Ask a question on our [discussions page][discussions], where we are happy to try and answer your questions!\n\n## Installation\n\nInstall via Cargo by adding to your `Cargo.toml` file:\n\n```toml\n[dependencies]\nisahc = \"1.7\"\n```\n\n### Minimum supported Rust version\n\nThe minimum supported Rust version (or _MSRV_) for Isahc is **stable Rust 1.46 or greater**, meaning we only guarantee that Isahc will compile if you use a rustc version of at least 1.46. It might compile with older versions but that could change at any time.\n\nThis version is explicitly tested in CI and may only be bumped in new minor versions. Any changes to the supported minimum version will be called out in the release notes.\n\n## Project goals\n\n- Create an ergonomic and innovative HTTP client API that is easy for beginners to use, and flexible for advanced uses.\n- Provide a high-level wrapper around libcurl.\n- Maintain a lightweight dependency tree and small binary footprint.\n- Provide additional client features that may be optionally compiled in.\n\nNon-goals:\n\n- Support for protocols other than HTTP.\n- Alternative engines besides libcurl. Other projects are better suited for this.\n\n## Why use Isahc and not X?\n\nIsahc provides an easy-to-use, flexible, and idiomatic Rust API that makes sending HTTP requests a breeze. The goal of Isahc is to make the easy way _also_ provide excellent performance and correctness for common use cases.\n\nIsahc uses [libcurl] under the hood to handle the HTTP protocol and networking. Using curl as an engine for an HTTP client is a great choice for a few reasons:\n\n- It is a stable, actively developed, and very popular library.\n- It is well-supported on a diverse list of platforms.\n- The HTTP protocol has a lot of unexpected gotchas across different servers, and curl has been around the block long enough to handle many of them.\n- It is well optimized and offers the ability to implement asynchronous requests.\n\nSafe Rust bindings to libcurl are provided by the [curl crate], which you can use yourself if you want to use curl directly. Isahc delivers a lot of value on top of vanilla curl, by offering a simpler, more idiomatic API and doing the hard work of turning the powerful [multi interface] into a futures-based API.\n\n## When would you *not* use Isahc?\n\nNot every library is perfect for every use-case. While Isahc strives to be a full-featured and general-purpose HTTP client that should work well for many projects, there are a few scenarios that Isahc is not well suited for:\n\n- **Tiny binaries**: If you are creating an application where tiny binary size is a key priority, you might find Isahc to be too large for you. While Isahc's dependencies are carefully curated and a number of features can be disabled, Isahc's core feature set includes things like async which does have some file size overhead. You might find something like [ureq] more suitable.\n- **WebAssembly support**: If your project needs to be able to be compiled to WebAssembly, then Isahc will probably not work for you. Instead you might like an HTTP client that supports multiple backends such as [Surf].\n- **Rustls support**: We hope to support [rustls] as a TLS backend someday, it is not currently supported directly. If for some reason rustls is a hard requirement for you, you'll need to use a different HTTP client for now.\n\n## License\n\nThis project's source code and documentation are licensed under the MIT license. See the [LICENSE](LICENSE) file for details.\n\nThe Isahc logo and related assets are licensed under a [Creative Commons Attribution 4.0 International License][cc-by]. See [LICENSE-CC-BY](LICENSE-CC-BY) for details.\n\n\n[async/await]: https://rust-lang.github.io/async-book/01_getting_started/04_async_await_primer.html\n[cc-by]: http://creativecommons.org/licenses/by/4.0/\n[chttp]: https://crates.io/crates/chttp\n[curl crate]: https://crates.io/crates/curl\n[discussions]: https://github.com/sagebind/isahc/discussions\n[documentation]: https://docs.rs/isahc\n[http]: https://github.com/hyperium/http\n[libcurl]: https://curl.haxx.se/libcurl/\n[MIT Kerberos]: https://web.mit.edu/kerberos/\n[multi interface]: https://curl.haxx.se/libcurl/c/libcurl-multi.html\n[rfc4559]: https://tools.ietf.org/html/rfc4559\n[rust]: https://www.rustlang.org\n[rustls]: https://github.com/ctz/rustls\n[serde]: https://serde.rs\n[Surf]: https://github.com/http-rs/surf\n[ureq]: https://github.com/algesten/ureq\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsagebind%2Fisahc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsagebind%2Fisahc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsagebind%2Fisahc/lists"}