From 4acf751ddeca449847aa866a56308949ba756955 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Fri, 9 Sep 2022 12:40:29 +1000 Subject: initial elisp binding --- lisp/servall-client.el | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 lisp/servall-client.el (limited to 'lisp/servall-client.el') diff --git a/lisp/servall-client.el b/lisp/servall-client.el new file mode 100644 index 0000000..2c6dd17 --- /dev/null +++ b/lisp/servall-client.el @@ -0,0 +1,50 @@ +;; -*- lexical-binding: t; -*- + +(defvar servall-endpoint "localhost:5555") +(defvar servall-client-buffer-name "*servall-client*") + +(defun servall-api-wikipedia-search (query) + (servall-url-fetch-json + (concat servall-endpoint "/wikipedia/search/" query))) + +(defun servall-api-wikipedia-org (name) + (servall-url-fetch-json + (concat servall-endpoint "/wikipedia/org/" name))) + +(defun servall-parse-http-header (text) + (let ((status) (fields)) + (with-temp-buffer + (insert text) + (goto-char (point-min)) + (re-search-forward "^HTTP.*\\([0-9]\\{3\\}\\).*$") + (setq status (match-string 1)) + (while (re-search-forward "^\\(.*?\\): \\(.*\\)$" nil t) + (push (cons (intern (match-string 1)) (match-string 2)) fields))) + (list (cons 'status status) (cons 'fields fields)))) + +(defun servall-url-fetch-json (url &optional decompression with-header) + (with-current-buffer (get-buffer-create servall-client-buffer-name) + (goto-char (point-max)) + (insert "[" (current-time-string) "] Request: " url "\n")) + (with-current-buffer (url-retrieve-synchronously url t) + (let ((header) (status) (fields) (json)) + (delete-http-header) + (setq header (servall-parse-http-header (car kill-ring)) + status (alist-get 'status header) + fields (alist-get 'fields header)) + (with-current-buffer servall-client-buffer-name + (insert "[" (current-time-string) "] Response: " status "\n")) + (when decompression + (call-process-region (point) (point-max) "gunzip" t t t) + (goto-char (point-min))) + (call-interactively 'delete-trailing-whitespace) + (if (string= status "200") + (unless (= (point) (point-max)) + (if with-header + (list + (cons 'header fields) + (cons 'json (json-read))) + (json-read))) + (error "HTTP error: %s" (buffer-substring (point) (point-max))))))) + +(provide 'servall-client) -- cgit v1.2.3