{"id":15470485,"url":"https://github.com/lpgauth/buoy","last_synced_at":"2025-07-10T05:39:21.063Z","repository":{"id":57481468,"uuid":"51447345","full_name":"lpgauth/buoy","owner":"lpgauth","description":"High-Performance Erlang HTTP 1.1 Client","archived":false,"fork":false,"pushed_at":"2025-04-24T17:57:31.000Z","size":3252,"stargazers_count":77,"open_issues_count":5,"forks_count":11,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-06-14T19:36:16.601Z","etag":null,"topics":["erlang","high-performance","http","http-client"],"latest_commit_sha":null,"homepage":"","language":"Erlang","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/lpgauth.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}},"created_at":"2016-02-10T14:50:43.000Z","updated_at":"2025-06-09T02:31:11.000Z","dependencies_parsed_at":"2025-01-02T03:11:54.068Z","dependency_job_id":"637b0dda-a0b6-4df1-b029-107c36a3eb7d","html_url":"https://github.com/lpgauth/buoy","commit_stats":{"total_commits":64,"total_committers":4,"mean_commits":16.0,"dds":0.109375,"last_synced_commit":"4ffbb27b4e1881771266907e0cf7fa4337a1b54c"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/lpgauth/buoy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpgauth%2Fbuoy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpgauth%2Fbuoy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpgauth%2Fbuoy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpgauth%2Fbuoy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lpgauth","download_url":"https://codeload.github.com/lpgauth/buoy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lpgauth%2Fbuoy/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264536022,"owners_count":23624405,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["erlang","high-performance","http","http-client"],"created_at":"2024-10-02T02:04:58.854Z","updated_at":"2025-07-10T05:39:21.019Z","avatar_url":"https://github.com/lpgauth.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# buoy\n\nHigh-Performance Erlang HTTP 1.1 Client\n\n![Build Status](https://github.com/lpgauth/buoy/workflows/Erlang%20CI/badge.svg)\n\n## Disclaimer:\nThis HTTP client has been designed for HTTP 1.1 with keep-alive. For performance reasons, it only implements a subset of RFC2616.\n\n### Unsupported Features:\n\n- Doesn't accept an arbitrary number of new lines in headers\n- Doesn't accept random capitalization of content-length header\n- Doesn't protect against malicious servers\n\n## API\n\u003ca href=\"http://github.com/lpgauth/buoy/blob/master/doc/buoy.md#index\" class=\"module\"\u003eFunction Index\u003c/a\u003e\n\n## Examples\n\n```erlang\n1\u003e buoy_app:start().\n{ok,[granderl,shackle,buoy]}\n\n2\u003e Url = buoy_utils:parse_url(\u003c\u003c\"http://example.com\"\u003e\u003e).\n{buoy_url,\u003c\u003c\"example.com\"\u003e\u003e,\u003c\u003c\"example.com\"\u003e\u003e,\u003c\u003c\"/\"\u003e\u003e,80,\n          http}\n\n3\u003e ok = buoy_pool:start(Url, [{pool_size, 1}]).\nok\n\n4\u003e {ok, Resp} = buoy:get(Url, #{timeout =\u003e 500}).\n{ok,{buoy_resp,done,\n               \u003c\u003c\"\u003c!doctype html\u003e\\n\u003chtml\u003e\\n\u003chead\u003e\\n    \u003ctitle\u003eExample Domain\u003c/title\u003e\\n\\n    \u003cmeta charset=\\\"utf-8\\\" /\u003e\\n  \"...\u003e\u003e,\n               1270,\n               [\u003c\u003c\"Cache-Control: max-age=604800\"\u003e\u003e,\n                \u003c\u003c\"Content-Type: text/html\"\u003e\u003e,\n                \u003c\u003c\"Date: Mon, 20 Mar 2017 14:48:25 GMT\"\u003e\u003e,\n                \u003c\u003c\"Etag: \\\"359670651+gzip+ident\\\"\"\u003e\u003e,\n                \u003c\u003c\"Expires: Mon, 27 Mar 2017 14:48:25 GMT\"\u003e\u003e,\n                \u003c\u003c\"Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT\"\u003e\u003e,\n                \u003c\u003c\"Server: ECS (cpm/F9D5)\"\u003e\u003e,\u003c\u003c\"Vary: Accept-Encoding\"\u003e\u003e,\n                \u003c\u003c\"X-Cache: HIT\"\u003e\u003e,\u003c\u003c\"Content-Length: 1270\"\u003e\u003e],\n               \u003c\u003c\"OK\"\u003e\u003e,200}}\n\n5\u003e {ok, Headers} = buoy_protocol:headers(Resp).\n{ok,[{\u003c\u003c\"Cache-Control\"\u003e\u003e,\u003c\u003c\"max-age=604800\"\u003e\u003e},\n     {\u003c\u003c\"Content-Type\"\u003e\u003e,\u003c\u003c\"text/html\"\u003e\u003e},\n     {\u003c\u003c\"Date\"\u003e\u003e,\u003c\u003c\"Mon, 20 Mar 2017 14:48:25 GMT\"\u003e\u003e},\n     {\u003c\u003c\"Etag\"\u003e\u003e,\u003c\u003c\"\\\"359670651+gzip+ident\\\"\"\u003e\u003e},\n     {\u003c\u003c\"Expires\"\u003e\u003e,\u003c\u003c\"Mon, 27 Mar 2017 14:48:25 GMT\"\u003e\u003e},\n     {\u003c\u003c\"Last-Modified\"\u003e\u003e,\u003c\u003c\"Fri, 09 Aug 2013 23:54:35 GMT\"\u003e\u003e},\n     {\u003c\u003c\"Server\"\u003e\u003e,\u003c\u003c\"ECS (cpm/F9D5)\"\u003e\u003e},\n     {\u003c\u003c\"Vary\"\u003e\u003e,\u003c\u003c\"Accept-Encoding\"\u003e\u003e},\n     {\u003c\u003c\"X-Cache\"\u003e\u003e,\u003c\u003c\"HIT\"\u003e\u003e},\n     {\u003c\u003c\"Content-Length\"\u003e\u003e,\u003c\u003c\"1270\"\u003e\u003e}]}\n```\n\n### Pool Options\n\n\u003ctable width=\"100%\"\u003e\n  \u003ctheader\u003e\n    \u003cth\u003eName\u003c/th\u003e\n    \u003cth\u003eType\u003c/th\u003e\n    \u003cth\u003eDefault\u003c/th\u003e\n    \u003cth\u003eDescription\u003c/th\u003e\n  \u003c/theader\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ebacklog_size\u003c/td\u003e\n    \u003ctd\u003epos_integer()\u003c/td\u003e\n    \u003ctd\u003e1024\u003c/td\u003e\n    \u003ctd\u003emaximum number of concurrent requests per connection\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epool_size\u003c/td\u003e\n    \u003ctd\u003epos_integer()\u003c/td\u003e\n    \u003ctd\u003e16\u003c/td\u003e\n    \u003ctd\u003enumber of connections\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003epool_strategy\u003c/td\u003e\n    \u003ctd\u003erandom | round_robin\u003c/td\u003e\n    \u003ctd\u003erandom\u003c/td\u003e\n    \u003ctd\u003econnection selection strategy\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ereconnect\u003c/td\u003e\n    \u003ctd\u003eboolean()\u003c/td\u003e\n    \u003ctd\u003etrue\u003c/td\u003e\n    \u003ctd\u003ereconnect closed connections\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ereconnect_time_max\u003c/td\u003e\n    \u003ctd\u003epos_integer() | infinity\u003c/td\u003e\n    \u003ctd\u003e120000\u003c/td\u003e\n    \u003ctd\u003ereconnect maximum time\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003ereconnect_time_min\u003c/td\u003e\n    \u003ctd\u003epos_integer()\u003c/td\u003e\n    \u003ctd\u003e500\u003c/td\u003e\n    \u003ctd\u003ereconnect minimum time\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003esocket_options\u003c/td\u003e\n    \u003ctd\u003e[gen_tcp:connect_option() | ssl:tls_client_option()]\u003c/td\u003e\n    \u003ctd\u003e[binary,\n    {packet, line},\n    {packet, raw},\n    {send_timeout, 50},\n    {send_timeout_close, true}]\u003c/td\u003e\n    \u003ctd\u003eoptions passed to the socket when connecting\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Tests\n\n```makefile\nmake dialyzer\nmake eunit\nmake xref\n```\n\n## License\n```license\nThe MIT License (MIT)\n\nCopyright (c) 2016-2023 Louis-Philippe Gauthier\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flpgauth%2Fbuoy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flpgauth%2Fbuoy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flpgauth%2Fbuoy/lists"}