1
0
Fork 0

- [rpc] fixed error handling.

This commit is contained in:
cage 2023-01-01 14:57:08 +01:00
parent 59a9b69605
commit a6a8b0ad8f
2 changed files with 35 additions and 18 deletions

View File

@ -185,15 +185,15 @@
:certificate certificate
:certificate-key certificate-key))))
(gemini-client:gemini-tofu-error (e)
(make-gemini-response-error (format nil "TOFU error: ~a" e)))
(error (format nil "TOFU error: ~a" e)))
(conditions:not-implemented-error (e)
(make-gemini-response-error (format nil (_ "Error: ~a") e)))
(error (format nil (_ "Error: ~a") e)))
(gemini-client:gemini-protocol-error (e)
(make-gemini-response-error (format nil "~a" e)))
(error (format nil "~a" e)))
(error (e)
(make-gemini-response-error (format nil (_ "Error getting ~s: ~a") url e)))
(error (format nil (_ "Error getting ~s: ~a") url e)))
(condition (c)
(make-gemini-response-error (format nil (_ "Error getting ~s: ~a") url c))))))
(error (format nil (_ "Error getting ~s: ~a") url c))))))
(defun gemini-request (iri use-cache)
(%gemini-request iri :use-cached-file-if-exists use-cache))

View File

@ -78,6 +78,9 @@
(defun make-internal-error-message (msg)
(make-response-error -32603 (format nil "Internal error: ~a" msg)))
(defun make-failed-request-error-message (msg)
(make-response-error -32001 (format nil "failed request: ~a" msg)))
(defclass function-param ()
((name
:initarg :name
@ -390,26 +393,37 @@
(t
(values method id params))))))
(defun maybe-log-message (m)
(declare (ignorable m))
#+(and debug-mode debug-json-rpc)
(misc:dbg m))
(defun elaborate-single-request (request)
(handler-case
(multiple-value-bind (method id params)
(displace-single-request request)
(let* ((request (apply #'make-request method id params))
(elaborated (call-function request)))
#+(and debug-mode debug-json-rpc)
(misc:dbg "jsonrpc request ~s results ~s" request elaborated)
(when id
;; if id is null is a notification (i.e. the client
;; does not care about an answer)
(make-response elaborated id :error-object nil))))
(json-rpc-error (e)
(make-response nil
(transaction-id e)
(handler-case
(let* ((request (apply #'make-request method id params))
(elaborated (call-function request)))
(maybe-log-message (format nil "jsonrpc request ~s results ~s" request elaborated))
(when id
;; if id is null is a notification (i.e. the client
;; does not care about an answer)
(make-response elaborated id :error-object nil)))
(json-rpc-error (e)
(make-response nil
nil
:error-object
(make-response-error (or (code e)
(response-error-code +error-invalid-request+))
(text e))))
(error (e)
(maybe-log-message (format nil "jsonrpc request failed: ~a" e))
(make-response nil
id
:error-object (make-failed-request-error-message (format nil "~a" e))))))
(error (e)
(maybe-log-message (format nil "jsonrpc request failed with internal error!: ~a" e))
(make-response nil
nil
:error-object (make-internal-error-message (format nil "~a" e))))))
@ -437,12 +451,15 @@
(defun elaborate-request (raw-request)
(handler-case
(with-input-from-string (stream raw-request)
(maybe-log-message (format nil "jsonrpc2 raw request~a" raw-request))
(let ((decoded (yason:parse stream :object-as :alist)))
(if (request-batch-p decoded)
(if (null decoded)
(elaborate-single-request decoded) ;; will build an error response
(remove-if #'null
(mapcar #'elaborate-single-request decoded)))
(elaborate-single-request decoded))))
(error ()
(let ((results (elaborate-single-request decoded)))
results))))
(error (e)
(maybe-log-message (format nil "request parse error: ~a" e))
(make-response nil nil :error-object +error-parse+))))