{"id":33236966,"url":"https://github.com/zellerin/http2","last_synced_at":"2026-03-18T01:32:04.375Z","repository":{"id":37780101,"uuid":"497782818","full_name":"zellerin/http2","owner":"zellerin","description":"HTTP/2 implementation in Common Lisp","archived":false,"fork":false,"pushed_at":"2025-12-19T15:19:22.000Z","size":1078,"stargazers_count":50,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-01-11T17:53:06.403Z","etag":null,"topics":["common-lisp","http2"],"latest_commit_sha":null,"homepage":"","language":"Common Lisp","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/zellerin.png","metadata":{"files":{"readme":"README.org","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":"2022-05-30T04:03:30.000Z","updated_at":"2026-01-03T19:48:08.000Z","dependencies_parsed_at":"2025-06-10T20:28:04.168Z","dependency_job_id":"a70cbe8e-9458-4232-86b3-da78940efdbd","html_url":"https://github.com/zellerin/http2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zellerin/http2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zellerin%2Fhttp2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zellerin%2Fhttp2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zellerin%2Fhttp2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zellerin%2Fhttp2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zellerin","download_url":"https://codeload.github.com/zellerin/http2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zellerin%2Fhttp2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30640073,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-18T00:09:27.587Z","status":"ssl_error","status_checked_at":"2026-03-18T00:09:26.123Z","response_time":56,"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":["common-lisp","http2"],"created_at":"2025-11-16T19:00:28.311Z","updated_at":"2026-03-18T01:32:04.367Z","avatar_url":"https://github.com/zellerin.png","language":"Common Lisp","readme":"#+TITLE: HTTP/2 in Common Lisp\n\n[[https://github.com/zellerin/http2/actions/workflows/test.yml/badge.svg]]\n\nThis is an implementation of HTTP/2 protocol as described in RFC9113 (and\nRFC7540 before) and RFC7541 (HPACK). It provides both high-level interface as\nwell as ways to fine tune its behaviour for better performance or specific use\ncases.\n\nFor quick start, quickload \"http2\" and run\n#+begin_src lisp\n  (http2/client:retrieve-url \"https://example.com\")\n#+end_src\nto fetch a HTTP/2 resource, and\n#+begin_src lisp\n  (http2/server:start 8443)\n\n  (define-exact-handler \"/\" (send-text-handler \"Hello World\"))\n#+end_src\nto start an empty TLS server and serve a \"Hello world\" page.\n\nCheck [[https://doc.zellerin.cz/http2/#HTTP2:@TUTORIALS%20MGL-PAX:SECTION][tutorials]] that show in more detail how to use the client or the server.\n\n** Demo pages\n\nSimple demo can be started by running\n: sbcl --script scaffolding/run-server.lisp\n\nIt opens two web server, multi-threaded one https://localhost:8080 and a polling\none on https://localhost:8081. Both should be functionally equivalent with a\ndifferent backend. Both provide a ~/test~ page that tests some more tricky parts\nof the backend in the browser.\n\n** Status\nIn quicklisp. Documentation on [[https://doc.zellerin.cz/http2/][separate page]].\n\nImplements both thread-per-client and poll-based single threaded server (that may be actually faster).\n\nTested primarily on sbcl, occasionally on ecl.\n\nAlmost all parts of the listed standards implemented, not necessary documented or declared stable\n\n** Missing pieces\n- No handling of priorities is implemented. This is more or less OK, as these are\n  only suggestions, and they are more or less dropped in RFC9113 anyway. But\n  nothing from RFC9218 is implemented neither (except for the setting).\n- Push promises are not implemented in the client. This is OK, they are disabled\n  by default (settings)\n- The MAX-HEADER-LIST-SIZE limit is not enforced, but it is declared as an\n  advisory setting anyway.\n- Some checks on behaviour of the peer are not enforced\n- The ping and setting frames are not automatically prioritized (they are\n  replied as soon as processed, but nothing prevent finishing long response\n  before that)\n\n** Dependencies\n\nThe core library used trivial-gray-streams to implement streams over data frames.\n\nClient and server - or at least some server versions - require usocket and\ncl+ssl to talk over TLS, and bordeaux-threads for concurrency.\n\nClient and server use puri to manipulate URLs.\n\nServer also uses cffi directly to check and confirm alpn\n\nDocumentation is done with mgl-pax.\n\nAdditionally, fiasco is used for testing (and Javascript for browser-side testing).\n\n** Speed \u0026 scaling\nThe code was not written with speed as primary concern. Measurements depend on\nmany tunable factor both on the client and the server (including platform).\n\nAnyway, run or modify the [[file:scaffolding/speed-test.lisp][speed test code]] for your results.\n: sbcl --script scaffolding/speed-test.lisp\n\n** License\nLicensed by MIT license.\n\nSome comments are taken over from the RFCs above and copyrighted by RFC\ncontributors. I read the copyright licenses for RFC that this is allowed.\n\n** Related software\nThere is an Akamai code on https://github.com/akamai/cl-http2-protocol that\nsupported bigger parts of the drafted HTTP/2 protocol in 2014; apparently hard\nif not impossible to run now. It used NPN instead of ALPN.\n\n#  LocalWords:  HPACK\n","funding_links":[],"categories":["Interfaces to other package managers"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzellerin%2Fhttp2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzellerin%2Fhttp2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzellerin%2Fhttp2/lists"}