From 69166a3c3a401a5c370fe82c2a081eea75815465 Mon Sep 17 00:00:00 2001 From: Elis Axelsson Date: Sun, 23 Apr 2017 09:15:48 +0200 Subject: [PATCH] Moved error-handling of failed requests out so providers must specify it Moved error-lambda out, there's currently two predefined ones. One that does allow failover and one that doesn't. This also kills the newly introduced no-failover key. But it's for the better anyways. This will make it much easier to actually do proper testing of different cases in the code that simply wasn't possible before. Also added a test of running the success lambda. --- test/webpaste-test.el | 29 +++++++++++++++++++++++----- webpaste.el | 45 ++++++++++++++++++++++++++++++------------- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/test/webpaste-test.el b/test/webpaste-test.el index 2b98880..3363aac 100644 --- a/test/webpaste-test.el +++ b/test/webpaste-test.el @@ -10,18 +10,37 @@ (ert-deftest webpaste-test/provider () "Test creation of providers." - (let ((success-lambda t) + (let ((used-lambda nil) (provider (webpaste-provider :uri "http://invalid-domain-name/" :post-field "data" - :no-failover t :sync t - :success-lambda (cl-function (lambda (&allow-other-keys) - (setq success-lambda nil)))))) + :success-lambda (cl-function + (lambda (&key data &allow-other-keys) + (setq used-lambda "success"))) + :error-lambda (cl-function + (lambda (&key error-thrown &allow-other-keys) + (setq used-lambda "error")))))) (funcall provider "dummy-text") - (should (equal t success-lambda)))) + (should (equal "error" used-lambda))) + + (let ((used-lambda nil) + (provider (webpaste-provider + :uri "https://httpbin.org/status/200" + :post-field "data" + :sync t + :success-lambda (cl-function + (lambda (&key data &allow-other-keys) + (setq used-lambda "success"))) + :error-lambda (cl-function + (lambda (&key error-thrown &allow-other-keys) + (setq used-lambda "error")))))) + + (funcall provider "dummy-text") + + (should (equal "success" used-lambda)))) diff --git a/webpaste.el b/webpaste.el index c9ec060..a4380ad 100644 --- a/webpaste.el +++ b/webpaste.el @@ -61,6 +61,20 @@ each run.") +;;; Predefined error lambda for providers +(defvar webpaste/providers-error-lambda + (cl-function (lambda (&key error-thrown &allow-other-keys) + (message "Got error: %S" error-thrown) + (webpaste-paste-text text))) + "Predefined error callback for providers that always does failover.") + + +(defvar webpaste/providers-error-lambda-no-failover + (cl-function (lambda (&key error-thrown &allow-other-keys) + (message "Got error: %S" error-thrown))) + "Predefined error callback for providers that shouldn't do failover.") + + ;;; Predefined success lambdas for providers (defvar webpaste/providers-success-location-header (cl-function (lambda (&key response &allow-other-keys) @@ -83,9 +97,9 @@ each run.") (type "POST") (parser 'buffer-string) (post-data '()) - (no-failover nil) (sync nil) post-field + error-lambda success-lambda) "Function to create the lambda function for a provider. @@ -99,11 +113,15 @@ Usage: `request'. This defaults to 'buffer-string. :post-data Default post fields sent to service. Defaults to nil. :post-field Name of the field to insert the code into. -:no-failover Set to t to not allow doing failovers. Defaults to nil. :sync Set to t to wait until request is done. Defaults to nil. This should only be used for debugging purposes. :success-lambda Callback sent to `request', look up how to write these in the - documentation for `request'." + documentation for `request'. +:error-lambda Callback sent to `request', look up how to write these in the + documentation for `request'. A good default value forr this is + `webpaste/providers-error-lambda', but there's also + `webpaste/providers-error-lambda-no-failover' available if you + need a provider that isn't allowed to failover." (lambda (text) "Paste TEXT to provider" @@ -118,11 +136,7 @@ Usage: :parser parser :success success-lambda :sync sync - :error - (cl-function (lambda (&key error-thrown &allow-other-keys) - (message "Got error: %S" error-thrown) - (unless no-failover - (webpaste-paste-text text)))))))) + :error error-lambda)))) @@ -132,19 +146,22 @@ Usage: ,(webpaste-provider :uri "https://ptpb.pw/" :post-field "c" - :success-lambda webpaste/providers-success-location-header)) + :success-lambda webpaste/providers-success-location-header + :error-lambda webpaste/providers-error-lambda)) ("ix.io" ,(webpaste-provider :uri "http://ix.io/" :post-field "f:1" - :success-lambda webpaste/providers-success-returned-string)) + :success-lambda webpaste/providers-success-returned-string + :error-lambda webpaste/providers-error-lambda)) ("sprunge.us" ,(webpaste-provider :uri "http://sprunge.us/" :post-field "sprunge" - :success-lambda webpaste/providers-success-returned-string)) + :success-lambda webpaste/providers-success-returned-string + :error-lambda webpaste/providers-error-lambda)) ("dpaste.com" ,(webpaste-provider @@ -154,7 +171,8 @@ Usage: ("poster" . "") ("expiry_days" . 1)) :post-field "content" - :success-lambda webpaste/providers-success-location-header)) + :success-lambda webpaste/providers-success-location-header + :error-lambda webpaste/providers-error-lambda)) ("dpaste.de" ,(webpaste-provider @@ -163,7 +181,8 @@ Usage: ("format" . "url") ("expires" . 86400)) :post-field "content" - :success-lambda webpaste/providers-success-returned-string))) + :success-lambda webpaste/providers-success-returned-string + :error-lambda webpaste/providers-error-lambda))) "Define all webpaste.el providers. Consists of provider name and lambda function to do the actuall call to the