Homepage: https://github.com/lorniu/pdd.el
Author: lorniu
Updated:
HTTP library & Async Toolkit
This package provides a robust and elegant library for HTTP requests and asynchronous operations in Emacs. It featuring a single, consistent API that works identically across different backends, maximizing code portability and simplifying development. - Unified Backend: Seamlessly utilize either the high-performance `curl' backend or the built-in `url.el'. It significantly enhances `url.el', adding essential features like cookie-jar support, streaming support, multipart uploads, comprehensive proxy support (HTTP/SOCKS with auth-source integration), smart request/response data conversion and automatic retries. - Developer Friendly: Offers a minimalist yet flexible API that is backend-agnostic, intuitive and easy to use. Features like variadic callbacks and header abbreviations can help you achieve more with less code. - Powerful Async Foundation: Features a native, cancellable `Promise/A+' implementation and intuitive `async/await' syntax for clean, readable concurrent code. Includes integrated async helpers for timers and external processes. Also includes a queue mechanism for fine-grained concurrency control when making multiple asynchronous requests. - Highly Extensible: Easily customize request/response flows using a clean transformer pipeline and object-oriented (EIEIO) backend design. This makes it easy to add new features or event entirely new backends. Currently, there are two backends: 1. pdd-url-backend, which is the default one 2. pdd-curl-backend, which is based on `plz'. You should make sure package `plz' and program `curl' are available on your OS to use it: (setq pdd-backend (pdd-curl-backend)) Usage: (pdd "https://httpbin.org/uuid" #'print) (pdd "https://httpbin.org/post" :headers '((bear "hello world")) :params '((name . "jerry") (age . 9)) :data '((key . "value") (file1 "~/aaa.jpg")) :done (lambda (json) (alist-get 'file json)) :proxy "socks5://localhost:1085" :cookie-jar (pdd-cookie-jar "~/xxx.mycookie")) (pdd-async (let* ((r1 (await (pdd "https://httpbin.org/ip") (pdd "https://httpbin.org/uuid"))) (r2 (await (pdd "https://httpbin.org/anything" `((ip . ,(alist-get 'origin (car r1))) (id . ,(alist-get 'uuid (cadr r1)))))))) (message "> Got: %s" (alist-get 'form r2)))) See README.md of https://github.com/lorniu/pdd.el for more