{"id":18077603,"url":"https://github.com/fukamachi/dexador","last_synced_at":"2026-01-27T01:31:54.998Z","repository":{"id":27634457,"uuid":"31119025","full_name":"fukamachi/dexador","owner":"fukamachi","description":"A fast HTTP client for Common Lisp","archived":false,"fork":false,"pushed_at":"2025-12-03T00:46:49.000Z","size":634,"stargazers_count":408,"open_issues_count":44,"forks_count":45,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-12-06T00:59:20.230Z","etag":null,"topics":["common-lisp","http-client"],"latest_commit_sha":null,"homepage":"http://ultra.wikia.com/wiki/Dexador","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":".github/FUNDING.yml","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},"funding":{"github":["fukamachi"]}},"created_at":"2015-02-21T07:56:36.000Z","updated_at":"2025-12-03T00:46:53.000Z","dependencies_parsed_at":"2024-03-23T15:35:17.000Z","dependency_job_id":"478543d5-a8a3-4c55-9b6a-6e2fa00d8206","html_url":"https://github.com/fukamachi/dexador","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fukamachi/dexador","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fdexador","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fdexador/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fdexador/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fdexador/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fukamachi","download_url":"https://codeload.github.com/fukamachi/dexador/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fukamachi%2Fdexador/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28795468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T01:07:07.743Z","status":"ssl_error","status_checked_at":"2026-01-27T01:07:06.974Z","response_time":59,"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","http-client"],"created_at":"2024-10-31T11:46:11.251Z","updated_at":"2026-01-27T01:31:54.993Z","avatar_url":"https://github.com/fukamachi.png","language":"Common Lisp","funding_links":["https://github.com/sponsors/fukamachi"],"categories":["Interfaces to other package managers"],"sub_categories":[],"readme":"# Dexador\n\n[![Build Status](https://travis-ci.org/fukamachi/dexador.svg?branch=master)](https://travis-ci.org/fukamachi/dexador)\n[![Coverage Status](https://coveralls.io/repos/fukamachi/dexador/badge.svg?branch=master)](https://coveralls.io/r/fukamachi/dexador)\n\nDexador is yet another HTTP client for Common Lisp with neat APIs and connection-pooling.\n\n## Warning\n\nThis software is still BETA quality. The APIs will be likely to change.\n\n## Differences from Drakma\n\n* Fast, particularly when requesting to the same host (See [Benchmark](#benchmark))\n* Neat APIs\n* Signal a condition when HTTP request failed\n* OpenSSL isn't required for Windows\n\nSee also [a presentation given at Lisp Meetup #31](http://www.slideshare.net/fukamachi/dexador-rises).\n\n## Usage\n\n```common-lisp\n(dex:get \"http://lisp.org/\")\n\n(dex:post \"https://example.com/login\"\n          :content '((\"name\" . \"fukamachi\") (\"password\" . \"1ispa1ien\")))\n```\n\n### Posting a form-data\n\nYou can specify a form-data at `:content` in an association list. The data will be sent in `application/x-www-form-urlencoded` format.\n\n```common-lisp\n(dex:post \"http://example.com/entry/create\"\n          :content '((\"title\" . \"The Truth About Lisp\")\n                     (\"body\" . \"In which the truth about lisp is revealed, and some alternatives are enumerated.\")))\n```\n\n### Auto-detects Multipart\n\nIf the association list contains a pathname, the data will be sent as `multipart/form-data`.\n\n```common-lisp\n(dex:post \"http://example.com/entry/create\"\n          :content '((\"photo\" . #P\"images/2015030201.jpg\")))\n```\n\n### Following redirects (GET or HEAD)\n\nIf the server reports that the requested page has moved to a different location (indicated with a Location header and a 3XX response code), Dexador will redo the request on the new place, the fourth return value shows.\n\n```common-lisp\n(dex:head \"http://lisp.org\")\n;=\u003e \"\"\n;   200\n;   #\u003cHASH-TABLE :TEST EQUAL :COUNT 7 {100D2A47A3}\u003e\n;   #\u003cQURI.URI.HTTP:URI-HTTP http://lisp.org/index.html\u003e\n;   NIL\n```\n\nYou can limit the count of redirection by specifying `:max-redirects` with an integer. The default value is `5`.\n\n### Using cookies\n\nDexador adopts [cl-cookie](https://github.com/fukamachi/cl-cookie) for its cookie management. All functions takes a cookie-jar instance at `:cookie-jar`.\n\n```common-lisp\n(defvar *cookie-jar* (cl-cookie:make-cookie-jar))\n\n(dex:head \"https://mixi.jp\" :cookie-jar *cookie-jar* :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Dexador/0.1 (SBCL 1.2.9); Darwin; 14.1.0\n;   Host: mixi.jp\n;   Accept: */*\n;   \n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   \u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\n;   HTTP/1.1 200 OK\n;   Date: Tue, 10 Mar 2015 10:16:29 GMT\n;   Server: Apache\n;   X-Dealer: 152151\n;   X-XRDS-Location: https://mixi.jp/xrds.pl\n;   Cache-Control: no-cache\n;   Pragma: no-cache\n;   Vary: User-Agent\n;   Content-Type: text/html; charset=EUC-JP\n;   Set-Cookie: _auid=9d47ca5a00ce4980c41511beb2626fd4; domain=.mixi.jp; path=/; expires=Thu, 09-Mar-2017 10:16:29 GMT\n;   Set-Cookie: _lcp=8ee4121c9866435007fff2c90dc31a4d; domain=.mixi.jp; expires=Wed, 11-Mar-2015 10:16:29 GMT\n;   X-Content-Type-Options: nosniff\n;   \n;   \u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\n\n;; Again\n(dex:head \"https://mixi.jp\" :cookie-jar *cookie-jar* :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Dexador/0.1 (SBCL 1.2.9); Darwin; 14.1.0\n;   Host: mixi.jp\n;   Accept: */*\n;   Cookie: _auid=b878756ed71a0ed5bcf527e324c78f8c; _lcp=8ee4121c9866435007fff2c90dc31a4d\n;   \n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   \u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\n;   HTTP/1.1 200 OK\n;   Date: Tue, 10 Mar 2015 10:16:59 GMT\n;   Server: Apache\n;   X-Dealer: 152146\n;   X-XRDS-Location: https://mixi.jp/xrds.pl\n;   Cache-Control: no-cache\n;   Pragma: no-cache\n;   Vary: User-Agent\n;   Content-Type: text/html; charset=EUC-JP\n;   Set-Cookie: _auid=b878756ed71a0ed5bcf527e324c78f8c; domain=.mixi.jp; path=/; expires=Thu, 09-Mar-2017 10:16:59 GMT\n;   Set-Cookie: _lcp=8ee4121c9866435007fff2c90dc31a4d; domain=.mixi.jp; expires=Wed, 11-Mar-2015 10:16:59 GMT\n;   X-Content-Type-Options: nosniff\n;   \n;   \u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\n```\n\n### Authorization\nYou can only supply either basic or bearer authorization.\n\n#### Basic Authorization\n\n```common-lisp\n(dex:head \"http://www.hatena.ne.jp/\" :basic-auth '(\"nitro_idiot\" . \"password\") :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Dexador/0.1 (SBCL 1.2.9); Darwin; 14.1.0\n;   Host: www.hatena.ne.jp\n;   Accept: */*\n;   Authorization: Basic bml0cm9faWRpb3Q6cGFzc3dvcmQ=\n;\n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n```\n#### Bearer Authorization\n\n```common-lisp\n(dex:head \"http://www.hatena.ne.jp/\" :bearer-auth \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\"\n                                     :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Dexador/0.9.15 (SBCL 2.4.3); Linux; 6.7.0-20-amd64\n;   Host: www.hatena.ne.jp\n;   Accept: */*\n;   Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\n;   \n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n```\n\n### Faking a User-Agent header\n\nYou can overwrite the default User-Agent header by simply specifying \"User-Agent\" in `:headers`.\n\n```common-lisp\n(dex:head \"http://www.sbcl.org/\" :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Dexador/0.1 (SBCL 1.2.6); Darwin; 14.1.0\n;   Host: www.sbcl.org\n;   Accept: */*\n;   \n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n\n(dex:head \"http://www.sbcl.org/\"\n          :headers '((\"User-Agent\" . \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18\"))\n          :verbose t)\n;-\u003e \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n;   HEAD / HTTP/1.1\n;   User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/600.3.18 (KHTML, like Gecko) Version/8.0.3 Safari/600.3.18\n;   Host: www.sbcl.org\n;   Accept: */*\n;   \n;   \u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\n```\n\n### Reusing a connection\n\nDexador reuses a connection by default. As it skips a TCP handshake, it would be much faster when you send requests to the same host continuously.\n\n### Handling unexpected HTTP status code\n\nDexador signals a condition `http-request-failed` when the server returned 4xx or 5xx status code.\n\n```common-lisp\n;; Handles 400 bad request\n(handler-case (dex:get \"http://lisp.org\")\n  (dex:http-request-bad-request ()\n    ;; Runs when 400 bad request returned\n    )\n  (dex:http-request-failed (e)\n    ;; For other 4xx or 5xx\n    (format *error-output* \"The server returned ~D\" (dex:response-status e))))\n\n;; Ignore 404 Not Found and continue\n(handler-bind ((dex:http-request-not-found #'dex:ignore-and-continue))\n  (dex:get \"http://lisp.org\"))\n\n;; Retry\n(handler-bind ((dex:http-request-failed #'dex:retry-request))\n  (dex:get \"http://lisp.org\"))\n\n;; Retry 5 times\n(let ((retry-request (dex:retry-request 5 :interval 3)))\n  (handler-bind ((dex:http-request-failed retry-request))\n    (dex:get \"http://lisp.org\")))\n```\n\n### Proxy\n\nYou can connect via proxy.\n\n```common-lisp\n(dex:get \"http://lisp.org/\" :proxy \"http://proxy.yourcompany.com:8080/\")\n```\n\nYou can connect via SOCKS5 proxy.\n\n```common-lisp\n(dex:get \"https://www.facebookcorewwwi.onion/\" :proxy \"socks5://127.0.0.1:9150\")\n```\n\nYou can set the default proxy by setting\n```dex:*default-proxy*```\nwhich defaults to the value of the environment variable HTTPS_PROXY or HTTP_PROXY\n\n## Functions\n\nAll functions take similar arguments.\n\n- `uri` (string or quri:uri)\n- `method` (keyword)\n  - The HTTP request method: `:GET`, `:HEAD`, `:OPTIONS`, `:PUT`, `:POST`, or `:DELETE`. The default is `:GET`.\n- `version` (number)\n  - The version of the HTTP protocol: typically `1.0` or `1.1`. The default is `1.1`.\n- `content` (string, alist or pathname)\n  - The body of the request.  content may be an alist containing key value pairs, where the value can be a string, pathname, an (array (unsigned-byte 8) (*)), or a cons.  If the value is\n  a cons, then it may contain a :content-type override such as: :content `((\"key\" ,(make-array 5 :element-type '(unsigned-byte 8)) :content-type \"application/octets\")) which will result in a\n  multipart form encoded submission.\n- `headers` (alist)\n  - The headers of the request. If the value of a pair is `NIL`, the header won't be sent. You can overwrite the default headers (Host, User-Agent, Accept, Content-Type) by this with the same header name.\n- `basic-auth` (cons of username and password)\n  - Username and password for basic authorization. This is a cons having username at car and password at cdr. (e.g. `'(\"foo\" . \"bar\")`)\n- `bearer-auth` (string)\n  - A string token, to add bearer auth header. \n- `cookie-jar` (cookie-jar of [cl-cookie](https://github.com/fukamachi/cl-cookie))\n  - A cookie jar object.\n- `connect-timeout` (fixnum)\n  - The seconds to timeout until the HTTP connection established. The default is `10`, the value of `*default-connect-timeout*`.\n- `read-timeout` (fixnum)\n  - The seconds to timeout until the whole HTTP body read. The default is `10`, the value of `*default-read-timeout*`.\n- `keep-alive` (boolean)\n  - A flag if the connection keep connected even after the HTTP request. The default is `T`.\n- `use-connection-pool` (boolean)\n  - When combined with `:keep-alive t`, will internally cache the socket connection to web servers to avoid having to open new ones.  This is compatible with `:want-stream t` (when you close the returned stream or it is garbage collected the connection will be returned to the pool).  If you pass in a stream with `:stream` then the connection pool is not used (unless there is a redirect to a new web server).  This is not supported when using the WINHTTP backend. The default is `T`.\n- `max-redirects` (fixnum)\n  - The limit of redirections. The default is `5`. If the redirection exceeds the limit, functions return the last response (not raise a condition).\n- `ssl-key-file`, `ssl-cert-file`, `ssl-key-password`\n  - for HTTPS connection\n- `stream`\n  - The stream to write an HTTP request. This is a way to reuse a connection and commonly used with `:keep-alive T`.  This allows the caller to do connection pooling, etc.  It is easier to just use `:use-connection-pool t`, which is the default, and let the dexador internals take care of this for you (only supported for usocket backends).\n- `verbose` (boolean)\n  - This option is for debugging. When `T`, it dumps the HTTP request headers.\n- `force-binary` (boolean)\n  - A flag for suppressing auto-decoding of the response body.\n\u003c!-- - `force-string` --\u003e\n- `want-stream` (boolean)\n  - A flag to get the response body as a stream.\n- `proxy` (string)\n  - for use proxy. defaults to the value of `dex:*default-proxy*` which defaults to the value of environment variables HTTPS_PROXY or HTTP_PROXY.  Not supported on windows currently\n- `insecure` (boolean)\n  - To bypass SSL certificate verification (use at your own risk). The default is `NIL`, the value of `*not-verify-ssl*`.\n\u003c!-- - `ca-path` --\u003e\n\n\n### \\[Function\\] request\n\n```common-lisp\n(dex:request uri \u0026key (method get) (version 1.1) content headers\n             basic-auth cookie-jar (connect-timeout *default-connect-timeout*)\n             (read-timeout *default-read-timeout*) (keep-alive t) (use-connection-pool t)\n             (max-redirects 5) ssl-key-file ssl-cert-file ssl-key-password stream\n             (verbose *verbose*) force-binary force-string want-stream proxy\n             (insecure *not-verify-ssl*) ca-path)\n;=\u003e body\n;   status\n;   response-headers\n;   uri\n;   stream\n```\n\nSend an HTTP request to `uri`.\n\nThe `body` is an octet vector or a string if the `Content-Type` is `text/*`. If you always want it to return an octet vector, specify `:force-binary` as `T`.\n\nThe `status` is an integer which represents HTTP status code.\n\nThe `response-headers` is a hash table which represents HTTP response headers. Note that all hash keys are downcased like \"content-type\". If there's duplicate HTTP headers, those values are concatenated with a comma.\n\nThe `uri` is a [QURI](https://github.com/fukamachi/quri) object which represents the last URI Dexador requested.\n\nThe `stream` is a usocket stream to communicate with the HTTP server if the connection is still alive and can be reused. This value may be `NIL` if `:keep-alive` is `NIL` or the server closed the connection with `Connection: close` header or you are using `:use-connection-pool t` which handles re-using the connections for you.\n\nThis function signals `http-request-failed` when the HTTP status code is 4xx or 5xx.\n\n### \\[Function\\] get\n\n```common-lisp\n(dex:get uri \u0026key version headers basic-auth cookie-jar keep-alive\n         use-connection-pool connect-timeout read-timeout max-redirects\n         force-binary force-string want-stream ssl-key-file\n         ssl-cert-file ssl-key-password stream verbose proxy insecure\n         ca-path)\n```\n\n### \\[Function\\] post\n\n```common-lisp\n(dex:post uri \u0026key version content headers basic-auth cookie-jar\n          keep-alive use-connection-pool connect-timeout read-timeout\n          force-binary force-string want-stream ssl-key-file\n          ssl-cert-file ssl-key-password stream verbose proxy insecure\n          ca-path)\n```\n\n### \\[Function\\] head\n\n```common-lisp\n(dex:head uri \u0026key version headers basic-auth cookie-jar connect-timeout\n          read-timeout max-redirects ssl-key-file ssl-cert-file\n          ssl-key-password stream verbose proxy insecure ca-path)\n```\n\n### \\[Function\\] put\n\n```common-lisp\n(dex:put uri \u0026key version content headers basic-auth cookie-jar\n         keep-alive use-connection-pool connect-timeout read-timeout\n         force-binary force-string want-stream ssl-key-file\n         ssl-cert-file ssl-key-password stream verbose proxy insecure\n         ca-path)\n```\n\n### \\[Function\\] patch\n\n```common-lisp\n(dex:patch uri \u0026key version content headers basic-auth cookie-jar\n           keep-alive use-connection-pool connect-timeout read-timeout\n           force-binary force-string want-stream ssl-key-file\n           ssl-cert-file ssl-key-password stream verbose proxy insecure\n           ca-path)\n```\n\n### \\[Function\\] delete\n\n```common-lisp\n(dex:delete uri \u0026key version headers basic-auth cookie-jar keep-alive\n            use-connection-pool connect-timeout read-timeout\n            force-binary force-string want-stream ssl-key-file\n            ssl-cert-file ssl-key-password stream verbose proxy insecure\n            ca-path)\n```\n\n### \\[Function\\] fetch\n\nSend a GET request to `URI` and write the response body to the `DESTINATION`.\n\n```common-lisp\n(dex:fetch uri destination \u0026key (if-exists error) verbose proxy insecure)\n```\n\n## Benchmark\n\n![Benchmark graph](images/benchmark.png)\n\n* Server\n  * Sakura VPS 1GB\n  * nginx 1.2.7, KeepAlive On\n* Client\n  * MacBook Pro OS X Yosemite (CPU: 3GHz Intel Core i7, Memory: 8GB)\n  * SBCL 1.2.9\n* Downloads an HTML file (181 bytes).\n\n### Drakma\n\n```\n(time (dotimes (i 30) (drakma:http-request \"http://files.8arrow.org/181B.html\")))\nEvaluation took:\n  1.012 seconds of real time\n  0.174742 seconds of total run time (0.148141 user, 0.026601 system)\n  17.29% CPU\n  1,683 forms interpreted\n  500 lambdas converted\n  3,027,928,949 processor cycles\n  29,416,656 bytes consed\n```\n\n### Dexador\n\n```\n(time (dotimes (i 30) (dex:get \"http://files.8arrow.org/181B.html\")))\nEvaluation took:\n  0.499 seconds of real time\n  0.028057 seconds of total run time (0.019234 user, 0.008823 system)\n  5.61% CPU\n  56 forms interpreted\n  16 lambdas converted\n  1,494,851,690 processor cycles\n  1,472,992 bytes consed\n```\n\n## See Also\n\n* [fast-http](https://github.com/fukamachi/fast-http)\n* [cl-cookie](https://github.com/fukamachi/cl-cookie)\n* [QURI](https://github.com/fukamachi/quri)\n\n## Author\n\n* Eitaro Fukamachi (e.arrows@gmail.com)\n\n## Copyright\n\nCopyright (c) 2015 Eitaro Fukamachi (e.arrows@gmail.com)\n\n## License\n\nLicensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffukamachi%2Fdexador","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffukamachi%2Fdexador","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffukamachi%2Fdexador/lists"}