mirror of
https://codeberg.org/cage/tinmop/
synced 2025-02-17 08:10:36 +01:00
- [rpc] fixed error handling.
This commit is contained in:
parent
59a9b69605
commit
a6a8b0ad8f
@ -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))
|
||||
|
@ -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+))))
|
||||
|
Loading…
x
Reference in New Issue
Block a user