{"id":13394006,"url":"https://github.com/vulcand/oxy","last_synced_at":"2026-04-01T20:43:55.507Z","repository":{"id":24233468,"uuid":"27626119","full_name":"vulcand/oxy","owner":"vulcand","description":"Go middlewares for HTTP servers \u0026 proxies","archived":false,"fork":false,"pushed_at":"2025-11-09T08:54:55.000Z","size":770,"stargazers_count":2099,"open_issues_count":32,"forks_count":327,"subscribers_count":70,"default_branch":"master","last_synced_at":"2026-02-13T00:26:02.632Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vulcand.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2014-12-06T07:23:38.000Z","updated_at":"2026-02-02T14:49:40.000Z","dependencies_parsed_at":"2023-01-14T00:37:28.351Z","dependency_job_id":"87f12983-f8ae-419e-af4f-3d48f497e7d3","html_url":"https://github.com/vulcand/oxy","commit_stats":{"total_commits":214,"total_committers":58,"mean_commits":3.689655172413793,"dds":0.6682242990654206,"last_synced_commit":"7642dfcd0a93da2323deaefc5d766ae0b43f38ad"},"previous_names":["mailgun/oxy"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/vulcand/oxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vulcand%2Foxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vulcand%2Foxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vulcand%2Foxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vulcand%2Foxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vulcand","download_url":"https://codeload.github.com/vulcand/oxy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vulcand%2Foxy/sbom","scorecard":{"id":1239604,"data":{"date":"2025-11-03","repo":{"name":"github.com/vulcand/oxy","commit":"ef4d702ff7846631fc2511e08855bd2a0f366286"},"scorecard":{"version":"v5.3.1-0.20251106164954-c65a663bf4a9","commit":"c65a663bf4a93c0f6eca32e6d34713d3e3440e11"},"score":4.2,"checks":[{"name":"Code-Review","score":3,"reason":"Found 9/30 approved changesets -- score normalized to 3","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/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#packaging"}},{"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/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#binary-artifacts"}},{"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/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/go-cross.yml:1","Warn: no topLevel permission defined: .github/workflows/pr.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-cross.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/vulcand/oxy/go-cross.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-cross.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/vulcand/oxy/go-cross.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/vulcand/oxy/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/vulcand/oxy/pr.yml/master?enable=pin","Warn: downloadThenRun not pinned by hash: .github/workflows/pr.yml:37","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 downloadThenRun 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/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/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/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#vulnerabilities"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 9 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c65a663bf4a93c0f6eca32e6d34713d3e3440e11/docs/checks.md#sast"}}]},"last_synced_at":"2025-11-09T10:21:50.941Z","repository_id":24233468,"created_at":"2025-11-09T10:21:50.941Z","updated_at":"2025-11-09T10:21:50.941Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291781,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T17:01:05.383Z","updated_at":"2026-04-01T20:43:55.482Z","avatar_url":"https://github.com/vulcand.png","language":"Go","funding_links":[],"categories":["开源类库","Open source library","Go","Web"],"sub_categories":["网络","The Internet","Web Servers and Proxies"],"readme":"Oxy [![Build Status](https://travis-ci.org/vulcand/oxy.svg?branch=master)](https://travis-ci.org/vulcand/oxy)\n=====\n\nOxy is a Go library with HTTP handlers that enhance HTTP standard library:\n\n* [Buffer](https://pkg.go.dev/github.com/vulcand/oxy/v2/buffer) retries and buffers requests and responses \n* [Stream](https://pkg.go.dev/github.com/vulcand/oxy/v2/stream) passes-through requests, supports chunked encoding with configurable flush interval \n* [Forward](https://pkg.go.dev/github.com/vulcand/oxy/v2/forward) forwards requests to remote location and rewrites headers \n* [Roundrobin](https://pkg.go.dev/github.com/vulcand/oxy/v2/roundrobin) is a round-robin load balancer \n* [Circuit Breaker](https://pkg.go.dev/github.com/vulcand/oxy/v2/cbreaker) Hystrix-style circuit breaker\n* [Connlimit](https://pkg.go.dev/github.com/vulcand/oxy/v2/connlimit) Simultaneous connections limiter\n* [Ratelimit](https://pkg.go.dev/github.com/vulcand/oxy/v2/ratelimit) Rate limiter (based on tokenbucket algo)\n* [Trace](https://pkg.go.dev/github.com/vulcand/oxy/v2/trace) Structured request and response logger\n\nIt is designed to be fully compatible with http standard library, easy to customize and reuse.\n\nStatus\n------\n\n* Initial design is completed\n* Covered by tests\n* Used as a reverse proxy engine in [Vulcand](https://github.com/vulcand/vulcand)\n\nQuickstart\n-----------\n\nEvery handler is ``http.Handler``, so writing and plugging in a middleware is easy. Let us write a simple reverse proxy as an example:\n\nSimple reverse proxy\n====================\n\n```go\n\nimport (\n  \"net/http\"\n  \"github.com/vulcand/oxy/v2/forward\"\n  \"github.com/vulcand/oxy/v2/testutils\"\n  )\n\n// Forwards incoming requests to whatever location URL points to, adds proper forwarding headers\nfwd := forward.New(false)\n\nredirect := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {\n    // let us forward this request to another server\n\t\treq.URL = testutils.ParseURI(\"http://localhost:63450\")\n\t\tfwd.ServeHTTP(w, req)\n})\n\t\n// that's it! our reverse proxy is ready!\ns := \u0026http.Server{\n\tAddr:           \":8080\",\n\tHandler:        redirect,\n}\ns.ListenAndServe()\n```\n\nAs a next step, let us add a round robin load-balancer:\n\n\n```go\n\nimport (\n  \"net/http\"\n  \"github.com/vulcand/oxy/v2/forward\"\n  \"github.com/vulcand/oxy/v2/roundrobin\"\n  )\n\n// Forwards incoming requests to whatever location URL points to, adds proper forwarding headers\nfwd := forward.New(false)\nlb, _ := roundrobin.New(fwd)\n\nlb.UpsertServer(url1)\nlb.UpsertServer(url2)\n\ns := \u0026http.Server{\n\tAddr:           \":8080\",\n\tHandler:        lb,\n}\ns.ListenAndServe()\n```\n\nWhat if we want to handle retries and replay the request in case of errors? `buffer` handler will help:\n\n\n```go\n\nimport (\n  \"net/http\"\n  \"github.com/vulcand/oxy/v2/forward\"\n  \"github.com/vulcand/oxy/v2/buffer\"\n  \"github.com/vulcand/oxy/v2/roundrobin\"\n  )\n\n// Forwards incoming requests to whatever location URL points to, adds proper forwarding headers\n\nfwd := forward.New(false)\nlb, _ := roundrobin.New(fwd)\n\n// buffer will read the request body and will replay the request again in case if forward returned status\n// corresponding to nework error (e.g. Gateway Timeout)\nbuffer, _ := buffer.New(lb, buffer.Retry(`IsNetworkError() \u0026\u0026 Attempts() \u003c 2`))\n\nlb.UpsertServer(url1)\nlb.UpsertServer(url2)\n\n// that's it! our reverse proxy is ready!\ns := \u0026http.Server{\n\tAddr:           \":8080\",\n\tHandler:        buffer,\n}\ns.ListenAndServe()\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvulcand%2Foxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvulcand%2Foxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvulcand%2Foxy/lists"}