{"id":13804648,"url":"https://github.com/fukamachi/quri","last_synced_at":"2026-01-18T23:01:59.660Z","repository":{"id":22412900,"uuid":"25750360","full_name":"fukamachi/quri","owner":"fukamachi","description":"Yet another URI library for Common Lisp","archived":false,"fork":false,"pushed_at":"2025-10-18T16:20:15.000Z","size":229,"stargazers_count":115,"open_issues_count":6,"forks_count":25,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-10-19T09:53:46.470Z","etag":null,"topics":["common-lisp","uri"],"latest_commit_sha":null,"homepage":"","language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fukamachi.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"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-10-25T23:20:41.000Z","updated_at":"2025-10-18T16:20:19.000Z","dependencies_parsed_at":"2023-12-15T10:31:19.101Z","dependency_job_id":"fe9c18ed-45cd-47ee-9993-3f305c2f4981","html_url":"https://github.com/fukamachi/quri","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/fukamachi/quri","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fquri","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fquri/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fquri/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fquri/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fukamachi","download_url":"https://codeload.github.com/fukamachi/quri/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fquri/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28553055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T20:59:07.572Z","status":"ssl_error","status_checked_at":"2026-01-18T20:59:02.799Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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","uri"],"created_at":"2024-08-04T01:00:51.758Z","updated_at":"2026-01-18T23:01:59.647Z","avatar_url":"https://github.com/fukamachi.png","language":"Common Lisp","funding_links":[],"categories":["REPLs ##","Interfaces to other package managers"],"sub_categories":["Isomorphic web frameworks"],"readme":"# QURI\n\n[![Build Status](https://travis-ci.org/fukamachi/quri.svg?branch=master)](https://travis-ci.org/fukamachi/quri)\n[![Coverage Status](https://coveralls.io/repos/fukamachi/quri/badge.svg?branch=master)](https://coveralls.io/r/fukamachi/quri)\n\n\u003cp align=center\u003e\u003ca href=\"https://www.flickr.com/photos/m-louis/8209540334/\"\u003e\u003cimg src=\"https://c7.staticflickr.com/9/8202/8209540334_76417d9fde_b.jpg\" alt=\"冷やしきゅうり\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp align=right\u003e\u003ci\u003ePhoto by \u003ca href=\"https://www.flickr.com/photos/m-louis/\"\u003em-louis\u003c/a\u003e, licensed under the \u003ca href=\"https://creativecommons.org/licenses/by-sa/2.0/\"\u003eCC BY-SA 2.0\u003c/a\u003e license.\u003c/i\u003e\u003c/p\u003e\n\n**QURI** (pronounced \"Q-ree\") is yet another URI library for Common Lisp. It is intended to be a replacement of [PURI](http://puri.kpe.io/).\n\nIt aims at implementing [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986).\nBehaviour that deviates from it should be considered a bug; please report.\n\n## Differences from PURI\n\n- Fast. (See [Benchmark](#benchmark).)\n- Doesn't encode/decode URL implicitly.\n- UTF-8 characters support.\n- Supports userinfo. (Example: `git` in `git@github.com`)\n- Supports IPv6 hostname. (Example: `ldap://[2001:db8::7]/`)\n- Allows byte vectors as input.\n- Takes optional `:start` and `:end` keyword arguments.\n- Low-level parser functions.\n- URL encoding/decoding utilities.\n  - `url-decode`\n  - `url-decode-params`\n  - `url-encode`\n  - `url-encode-params`\n\n## Usage\n\n```common-lisp\n(use-package :quri)\n\n(defvar *uri* (uri \"http://www.ics.uci.edu/pub/ietf/uri/#Related\"))\n\n*uri*\n;=\u003e #\u003cQURI.URI.HTTP:URI-HTTP http://www.ics.uci.edu/pub/ietf/uri/#Related\u003e\n\n(uri-scheme *uri*)\n;=\u003e \"http\"\n\n(uri-host *uri*)\n;=\u003e \"www.ics.uci.edu\"\n\n(uri-domain *uri*)\n;=\u003e \"uci.edu\"\n\n(uri-path *uri*)\n;=\u003e \"/pub/ietf/uri/\"\n\n(uri-fragment *uri*)\n;=\u003e \"Related\"\n```\n\n## Functions\n\n### \\[Function] uri\n\nParse a string or a byte vector and return a `uri` object.\n\n### \\[Function] make-uri\n\nCreate a `uri` object.\n\n```common-lisp\n(make-uri :scheme \"http\"\n          :host \"8arrow.org\"\n          :path \"/\")\n;=\u003e #\u003cQURI.URI.HTTP:URI-HTTP http://8arrow.org/\u003e\n\n(make-uri :defaults \"http://8arrow.org\"\n          :query '((\"guest\" . 1)))\n;=\u003e #\u003cQURI.URI.HTTP:URI-HTTP http://8arrow.org?guest=1\u003e\n```\n\n### \\[Function] copy-uri\n\nReturn a copy of the given `uri` object.\n\n### \\[Function] merge-uris\n\nMerge a reference URI into the base URI as described in RFC 2396 Section 5.2. The returned URI may or may not be a new instance. Neither REFERENCE nor BASE is mutated.\n\n### \\[Structure] uri\n\nStructure class as a representation of URIs. The following methods are available for all classes extends this class.\n\n#### Methods\n\n- `uri-scheme`\n- `uri-userinfo`\n- `uri-host`\n- `uri-domain`\n- `uri-tld`\n- `uri-port`\n- `uri-path`\n- `uri-authority`\n- `render-uri`\n\n### \\[Structure] urn (extends uri)\n\nStructure class as a representation of URNs. All methods of `uri` are also available for this class.\n\n#### Methods\n\n- `urn-nid`\n- `urn-nss`\n\n### \\[Structure] uri-http (extends uri)\n\nStructure class for HTTP/HTTPS URIs.\n\n#### Methods\n\n- `uri-query-params`\n\n```common-lisp\n(defvar *uri* (quri:uri \"http://quickdocs.org/search?q=web\"))\n\n(uri-query-params *uri*)\n;=\u003e ((\"q\" . \"web\"))\n\n(setf (uri-query-params *uri*) '((\"q\" . \"system programming\")))\n\n*uri*\n;=\u003e #\u003cQURI.URI.HTTP:URI-HTTP http://quickdocs.org/search?q=system%20programming\u003e\n```\n\n### \\[Structure] uri-ftp (extends uri)\n\nStructure class for FTP URIs.\n\n#### Methods\n\n- `uri-ftp-typecode`\n\n### \\[Structure] uri-ldap (extends uri)\n\nStructure class for LDAP/LDAPS URIs.\n\n#### Methods\n\n- `uri-ldap-dn`\n- `uri-ldap-attributes`\n- `uri-ldap-scope`\n- `uri-ldap-filter`\n- `uri-ldap-extensions`\n\n### \\[Function] url-decode\n\nDecode a Percent-Encoded string or byte vector.\n\n```common-lisp\n(url-decode \"%2Ffoo%E3%81%82\")\n;=\u003e \"/fooあ\"\n```\n\n### \\[Function] url-decode-params\n\nDecode a [form-urlencoded](http://tools.ietf.org/html/rfc1866#section-8.2.1) string or byte vector and return an association list.\n\n### \\[Function] url-encode\n\nEncode a string or a byte vector into a Percent-Encoded string.\n\n```common-lisp\n(url-encode \"/fooあ\")\n;=\u003e \"%2Ffoo%E3%81%82\"\n```\n\n### \\[Function] url-encode-params\n\nEncode an association list into a [form-urlencoded](http://tools.ietf.org/html/rfc1866#section-8.2.1) string.\n\n## Low-level functions\n\n### \\[Function] parse-uri\n\nParse a URI string or a URI byte vector and return 7 URI components -- scheme, userinfo, host name, port, path, query and fragment.\n\n```common-lisp\n(parse-uri \"http://www.ics.uci.edu/pub/ietf/uri/#Related\")\n;=\u003e \"http\"\n;   NIL\n;   \"www.ics.uci.edu\"\n;   NIL\n;   \"/pub/ietf/uri/\"\n;   NIL\n;   \"Related\"\n```\n\n## Installation\n\n```\n$ git clone https://github.com/fukamachi/quri\n```\n\n```common-lisp\n(ql:quickload :quri)\n```\n\n## Benchmark\n\n### Parsing URI\n\n- Parsing a URI string 100,000 times.\n\n|  QURI  |  PURI  |\n|--------|--------|\n| 0.064s | 0.423s |\n\nQURI is **6.6 times faster** than PURI for URI parsing.\n\n#### QURI\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (quri:uri \"http://www.ics.uci.edu/pub/ietf/uri/#Related\")))\n```\n\n```\nEvaluation took:\n  0.064 seconds of real time\n  0.063984 seconds of total run time (0.063745 user, 0.000239 system)\n  100.00% CPU\n  191,340,531 processor cycles\n  28,807,728 bytes consed\n```\n\n#### PURI\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (puri:uri \"http://www.ics.uci.edu/pub/ietf/uri/#Related\")))\n```\n\n```\nEvaluation took:\n  0.423 seconds of real time\n  0.425327 seconds of total run time (0.422234 user, 0.003093 system)\n  [ Run times consist of 0.004 seconds GC time, and 0.422 seconds non-GC time. ]\n  100.47% CPU\n  1,266,663,894 processor cycles\n  64,001,408 bytes consed\n```\n\n### URL decoding\n\n- Decoding a URL-encoded string 100,000 times.\n\n|  QURI  | Hunchentoot | do-urlencode |\n|--------|-------------|--------------|\n| 0.029s |    0.089s   |    0.634s    |\n\nQURI is **3 times faster** than Hunchentoot, and **21.8 times faster** than do-urlencode.\n\n#### QURI\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (quri:url-decode \"foo%E3%81%82\")))\n```\n\n```\nEvaluation took:\n  0.029 seconds of real time\n  0.028683 seconds of total run time (0.027934 user, 0.000749 system)\n  100.00% CPU\n  85,421,676 processor cycles\n  7,993,456 bytes consed\n```\n\n#### Hunchentoot\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (hunchentoot:url-decode \"foo%E3%81%82\")))\n```\n\n```\nEvaluation took:\n  0.089 seconds of real time\n  0.088946 seconds of total run time (0.087632 user, 0.001314 system)\n  100.00% CPU\n  265,341,714 processor cycles\n  17,611,968 bytes consed\n```\n\n#### do-urlencode\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (do-urlencode:urldecode \"foo%E3%81%82\")))\n```\n\n```\nEvaluation took:\n  0.634 seconds of real time\n  0.637236 seconds of total run time (0.632224 user, 0.005012 system)\n  [ Run times consist of 0.023 seconds GC time, and 0.615 seconds non-GC time. ]\n  100.47% CPU\n  1,897,304,959 processor cycles\n  153,606,064 bytes consed\n```\n\n### URL encoding\n\n- URL-encoding a string 100,000 times.\n\n|  QURI  | Hunchentoot | do-urlencode |\n|--------|-------------|--------------|\n| 0.074s |    0.282s   |    0.317s    |\n\nQURI is **3.8 times faster** than Hunchentoot, and **4.2 times faster** than do-urlencode.\n\n#### QURI\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (quri:url-encode \"fooあ\")))\n```\n\n```\nEvaluation took:\n  0.074 seconds of real time\n  0.074284 seconds of total run time (0.072908 user, 0.001376 system)\n  100.00% CPU\n  221,267,517 processor cycles\n  31,993,520 bytes consed\n```\n\n#### Hunchentoot\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (hunchentoot:url-encode \"fooあ\")))\n```\n\n```\nEvaluation took:\n  0.282 seconds of real time\n  0.284922 seconds of total run time (0.280063 user, 0.004859 system)\n  [ Run times consist of 0.034 seconds GC time, and 0.251 seconds non-GC time. ]\n  101.06% CPU\n  845,204,850 processor cycles\n  214,382,672 bytes consed\n```\n\n#### do-urlencode\n\n```common-lisp\n(time\n  (dotimes (i 100000)\n    (do-urlencode:urlencode \"fooあ\")))\n```\n\n```\nEvaluation took:\n  0.317 seconds of real time\n  0.319419 seconds of total run time (0.314339 user, 0.005080 system)\n  [ Run times consist of 0.026 seconds GC time, and 0.294 seconds non-GC time. ]\n  100.63% CPU\n  946,704,912 processor cycles\n  219,186,768 bytes consed\n```\n\n## Change log\n\n### 0.7.0\n\n- Add `:lenient` option `uri-query-params` (default to `T`).\n\n- Fix `merge-uris` to accept strings as it did in 0.4.0.\n\n- Support MSVC on ECL.\n\n- Coerce URI `path` to strings.\n\n### 0.6.0\n\n- All constructors like `make-uri-file` and `make-uri-https` exported.\n\n- `uri=` and `uri-equal` normalize the path so that NIL and \"\" are considered equal.\n\n- The `file` scheme renders the query and the fragment.\n\n### 0.5.0\n\n- URI schemes are now read-only.\n\n  This preserves the integrity of the structures (or else the scheme of a\n  `uri-http` could be set to FTP).\n  \n  `merge-uris` has been updated accordingly, so now the following returns the\n  right thing:\n\n  ```lisp\n  (merge-uris (uri \"/\") (uri \"https://en.wikipedia.org/wiki/URL\"))\n  ; =\u003e #\u003cURI-HTTPS https://en.wikipedia.org/\u003e\n  ```\n\n- Prevent some functions from being affected by *PRINT-BASE*.\n\n  Functions `make-uri` and `uri-authority` build strings from a number; they now\n  do so with the standard value for `*print-base*`.\n\n### 0.4.0\n\n- Query values accept numbers again.\n  This should fix backward-compatibility issues.\n\n- New `uri-equal` which normalizes the path when comparing URIs.\n\n- The empty path and the root path are no longer equal with `uri=`.  Use\n  `uri-equal` if you want the old behaviour.\n\n- Dot segments are removed when merging URLs.\n\n- Fix parsing of the colon at the end of the scheme.\n\n### 0.3.0\n\n- Handle strings and byte vectors in query values, and nothing else.\n\n  In particular, numbers are no longer supported.  You'll have to convert them\n  to a string or a byte-vector from the caller.\n\n- `parse-uri-string` and `parse-uri-byte-vector` now return the scheme default\n  port when unspecified.\n\n## Authors and maintainers\n\n* Eitaro Fukamachi (e.arrows@gmail.com): author\n* André A. Gomes (andremegafone@gmail.com): maintainer\n\n## Copyright\n\nCopyright (c) 2014-2019 Eitaro Fukamachi (e.arrows@gmail.com)\n\n## License\n\nLicensed under the BSD 3-Clause License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffukamachi%2Fquri","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffukamachi%2Fquri","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffukamachi%2Fquri/lists"}