From 8520659c0908a553a7c646fe788bbc64deea903b Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 10 May 2023 09:22:25 +0200 Subject: refactor concat-params-to-url, replace append-query string --- lisp/mastodon-http.el | 56 ++++++++++++++++++--------------------------------- 1 file changed, 20 insertions(+), 36 deletions(-) (limited to 'lisp/mastodon-http.el') diff --git a/lisp/mastodon-http.el b/lisp/mastodon-http.el index 49ffbf8..9d9b6e4 100644 --- a/lisp/mastodon-http.el +++ b/lisp/mastodon-http.el @@ -147,19 +147,21 @@ Authorization header is included by default unless UNAUTHENTICATED-P is non-nil. (with-temp-buffer (mastodon-http--url-retrieve-synchronously url))) unauthenticated-p)) +(defun mastodon-http--concat-params-to-url (url params) + "Build a query string with PARAMS and concat to URL." + (if params + (concat url "?" + (mastodon-http--build-params-string params)) + url)) (defun mastodon-http--get (url &optional params silent) "Make synchronous GET request to URL. PARAMS is an alist of any extra parameters to send with the request. SILENT means don't message." - (mastodon-http--authorized-request - "GET" - ;; url-request-data doesn't seem to work with GET requests: - (let ((url (if params - (concat url "?" - (mastodon-http--build-params-string params)) - url))) - (mastodon-http--url-retrieve-synchronously url silent)))) + (mastodon-http--authorized-request "GET" + ;; url-request-data doesn't seem to work with GET requests?: + (let ((url (mastodon-http--concat-params-to-url url params))) + (mastodon-http--url-retrieve-synchronously url silent)))) (defun mastodon-http--get-response (url &optional params no-headers silent vector) "Make synchronous GET request to URL. Return JSON and response headers. @@ -232,15 +234,10 @@ Callback to `mastodon-http--get-response-async', usually "Make DELETE request to URL. PARAMS is an alist of any extra parameters to send with the request." ;; url-request-data only works with POST requests? - (let ((url - (if params - (concat url "?" - (mastodon-http--build-params-string params)) - url))) - (mastodon-http--authorized-request - "DELETE" - (with-temp-buffer - (mastodon-http--url-retrieve-synchronously url))))) + (let ((url (mastodon-http--concat-params-to-url url params))) + (mastodon-http--authorized-request "DELETE" + (with-temp-buffer + (mastodon-http--url-retrieve-synchronously url))))) (defun mastodon-http--put (url &optional params headers) "Make PUT request to URL. @@ -258,12 +255,6 @@ HEADERS is an alist of any extra headers to send with the request." headers))) (with-temp-buffer (mastodon-http--url-retrieve-synchronously url))))) -(defun mastodon-http--append-query-string (url params) - "Append PARAMS to URL as query strings and return it. -PARAMS should be an alist as required by `url-build-query-string'." - (let ((query-string (url-build-query-string params))) - (concat url "?" query-string))) - ;; profile update functions (defun mastodon-http--patch-json (url &optional params) @@ -275,12 +266,9 @@ Optionally specify the PARAMS to send." (defun mastodon-http--patch (base-url &optional params) "Make synchronous PATCH request to BASE-URL. Optionally specify the PARAMS to send." - (mastodon-http--authorized-request - "PATCH" - (let ((url - (concat base-url "?" - (mastodon-http--build-params-string params)))) - (mastodon-http--url-retrieve-synchronously url)))) + (mastodon-http--authorized-request "PATCH" + (let ((url (mastodon-http--concat-params-to-url base-url params))) + (mastodon-http--url-retrieve-synchronously url)))) ;; Asynchronous functions @@ -288,13 +276,9 @@ Optionally specify the PARAMS to send." "Make GET request to URL. Pass response buffer to CALLBACK function with args CBARGS. PARAMS is an alist of any extra parameters to send with the request." - (let ((url (if params - (concat url "?" - (mastodon-http--build-params-string params)) - url))) - (mastodon-http--authorized-request - "GET" - (url-retrieve url callback cbargs)))) + (let ((url (mastodon-http--concat-params-to-url url params))) + (mastodon-http--authorized-request "GET" + (url-retrieve url callback cbargs)))) (defun mastodon-http--get-response-async (url &optional params callback &rest cbargs) "Make GET request to URL. Call CALLBACK with http response and CBARGS. -- cgit v1.2.3 From 0326fb24ff527cd67916f9392387068037068b7c Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 10 May 2023 09:23:25 +0200 Subject: audit http.el --- lisp/mastodon-http.el | 95 +++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 52 deletions(-) (limited to 'lisp/mastodon-http.el') diff --git a/lisp/mastodon-http.el b/lisp/mastodon-http.el index 9d9b6e4..ba79bd0 100644 --- a/lisp/mastodon-http.el +++ b/lisp/mastodon-http.el @@ -86,8 +86,6 @@ Message status and JSON error from RESPONSE if unsuccessful." (mastodon-http--status)))) (if (string-prefix-p "2" status) (funcall success) - ;; don't switch to buffer, just with-current-buffer the response: - ;; (switch-to-buffer response) ;; 404 sometimes returns http response so --process-json fails: (if (string-prefix-p "404" status) (message "Error %s: page not found" status) @@ -104,7 +102,8 @@ Message status and JSON error from RESPONSE if unsuccessful." (defmacro mastodon-http--authorized-request (method body &optional unauthenticated-p) "Make a METHOD type request using BODY, with Mastodon authorization. Unless UNAUTHENTICATED-P is non-nil." - (declare (debug 'body)) + (declare (debug 'body) + (indent 1)) `(let ((url-request-method ,method) (url-request-extra-headers (unless ,unauthenticated-p @@ -115,14 +114,12 @@ Unless UNAUTHENTICATED-P is non-nil." (defun mastodon-http--build-params-string (params) "Build a request parameters string from parameters alist PARAMS." ;; (url-build-query-string args nil)) - ;; url-build-query-string adds 'nil' to empty params so lets stay with our + ;; url-build-query-string adds 'nil' for empty params so lets stick with our ;; own: (mapconcat (lambda (p) (concat (url-hexify-string (car p)) - "=" - (url-hexify-string (cdr p)))) - params - "&")) + "=" (url-hexify-string (cdr p)))) + params "&")) (defun mastodon-http--build-array-params-alist (param-str array) "Return parameters alist using PARAM-STR and ARRAY param values. @@ -133,20 +130,18 @@ Used for API form data parameters that take an array." (defun mastodon-http--post (url &optional params headers unauthenticated-p) "POST synchronously to URL, optionally with PARAMS and HEADERS. Authorization header is included by default unless UNAUTHENTICATED-P is non-nil." - (mastodon-http--authorized-request - "POST" - (let ((url-request-data - (when params - (mastodon-http--build-params-string params))) - (url-request-extra-headers - (append url-request-extra-headers ; auth set in macro - ;; pleroma compat: - (unless (assoc "Content-Type" headers) - '(("Content-Type" . "application/x-www-form-urlencoded"))) - headers))) - (with-temp-buffer - (mastodon-http--url-retrieve-synchronously url))) - unauthenticated-p)) + (mastodon-http--authorized-request "POST" + (let ((url-request-data (when params + (mastodon-http--build-params-string params))) + (url-request-extra-headers + (append url-request-extra-headers ; auth set in macro + (unless (assoc "Content-Type" headers) ; pleroma compat: + '(("Content-Type" . "application/x-www-form-urlencoded"))) + headers))) + (with-temp-buffer + (mastodon-http--url-retrieve-synchronously url))) + unauthenticated-p)) + (defun mastodon-http--concat-params-to-url (url params) "Build a query string with PARAMS and concat to URL." (if params @@ -199,17 +194,14 @@ Callback to `mastodon-http--get-response-async', usually (goto-char (point-min)) (re-search-forward "^$" nil 'move) (let ((json-array-type (if vector 'vector 'list)) - (json-string - (decode-coding-string - (buffer-substring-no-properties (point) (point-max)) - 'utf-8))) + (json-string (decode-coding-string + (buffer-substring-no-properties (point) (point-max)) + 'utf-8))) (kill-buffer) - ;; (unless (or (string-empty-p json-string) (null json-string)) (cond ((or (string-empty-p json-string) (null json-string)) nil) - ;; if we don't have json, maybe we have a plain string error - ;; message (misskey works like this for instance, but there are - ;; probably less dunce ways to do this): + ;; if no json, maybe we have a plain string error message (misskey + ;; does this, but there are probably better ways to do this): ;; FIXME: friendica at least sends plain html if endpoint not found. ((not (or (string-prefix-p "\n{" json-string) (string-prefix-p "\n[" json-string))) @@ -243,17 +235,15 @@ PARAMS is an alist of any extra parameters to send with the request." "Make PUT request to URL. PARAMS is an alist of any extra parameters to send with the request. HEADERS is an alist of any extra headers to send with the request." - (mastodon-http--authorized-request - "PUT" - (let ((url-request-data - (when params (mastodon-http--build-params-string params))) - (url-request-extra-headers - (append url-request-extra-headers ; auth set in macro - ;; pleroma compat: - (unless (assoc "Content-Type" headers) - '(("Content-Type" . "application/x-www-form-urlencoded"))) - headers))) - (with-temp-buffer (mastodon-http--url-retrieve-synchronously url))))) + (mastodon-http--authorized-request "PUT" + (let ((url-request-data + (when params (mastodon-http--build-params-string params))) + (url-request-extra-headers + (append url-request-extra-headers ; auth set in macro + (unless (assoc "Content-Type" headers) ; pleroma compat: + '(("Content-Type" . "application/x-www-form-urlencoded"))) + headers))) + (with-temp-buffer (mastodon-http--url-retrieve-synchronously url))))) ;; profile update functions @@ -287,7 +277,7 @@ PARAMS is an alist of any extra parameters to send with the request." url params (lambda (status) - (when status ;; only when we actually get sth? + (when status ; for flakey servers (apply callback (mastodon-http--process-response) cbargs))))) (defun mastodon-http--get-json-async (url &optional params callback &rest cbargs) @@ -304,14 +294,12 @@ PARAMS is an alist of any extra parameters to send with the request." "POST asynchronously to URL with PARAMS and HEADERS. Then run function CALLBACK with arguements CBARGS. Authorization header is included by default unless UNAUTHENTICED-P is non-nil." - (mastodon-http--authorized-request - "POST" - (let ((request-timeout 5) - (url-request-data - (when params - (mastodon-http--build-params-string params)))) - (with-temp-buffer - (url-retrieve url callback cbargs))))) + (mastodon-http--authorized-request "POST" + (let ((request-timeout 5) + (url-request-data (when params + (mastodon-http--build-params-string params)))) + (with-temp-buffer + (url-retrieve url callback cbargs))))) ;; TODO: test for curl first? (defun mastodon-http--post-media-attachment (url filename caption) @@ -353,9 +341,12 @@ item uploaded, and `mastodon-toot--update-status-fields' is run." ;; handle mastodon api errors ;; they have the form (error http 401) ((= (car (last error-thrown)) 401) - (message "Got error: %s Unauthorized: The access token is invalid" error-thrown)) + (message "Got error: %s Unauthorized: The access token is invalid" + error-thrown)) ((= (car (last error-thrown)) 422) - (message "Got error: %s Unprocessable entity: file or file type is unsupported or invalid" error-thrown)) + (message "Got error: %s Unprocessable entity: file or file\ + type is unsupported or invalid" + error-thrown)) (t (message "Got error: %s Shit went south" error-thrown)))))))) -- cgit v1.2.3