X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elpher.el;h=1758e86d5dabcf3148b70efd0d7183710d1e5cbe;hb=d96c4a31149d4506fd2f3dbe31830c73b2568bed;hp=b94eb189a0d2be2ebf4d56dd4315a17579c7b4b0;hpb=f79e9c2af2829841501935b77ecd4368ca1c43c5;p=elpher.git diff --git a/elpher.el b/elpher.el index b94eb18..1758e86 100644 --- a/elpher.el +++ b/elpher.el @@ -4,7 +4,7 @@ ;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.0.3 +;; Version: 2.3.1 ;; Keywords: comm gopher ;; Homepage: https://github.com/tgvaughan/elpher ;; Package-Requires: ((emacs "26")) @@ -65,7 +65,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.0.3" +(defconst elpher-version "2.3.1" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -191,13 +191,14 @@ allows switching from an encrypted channel back to plain text without user input (let ((data (match-data))) ; Prevent parsing clobbering match data (unwind-protect (let ((url (url-generic-parse-url url-string))) - (setf (url-fullness url) t) - (setf (url-filename url) - (url-unhex-string (url-filename url))) - (unless (url-type url) - (setf (url-type url) "gopher")) - (when (or (equal "gopher" (url-type url)) - (equal "gophers" (url-type url))) + (unless (and (not (url-fullness url)) (url-type url)) + (setf (url-fullness url) t) + (setf (url-filename url) + (url-unhex-string (url-filename url))) + (unless (url-type url) + (setf (url-type url) "gopher")) + (when (or (equal "gopher" (url-type url)) + (equal "gophers" (url-type url))) ;; Gopher defaults (unless (url-host url) (setf (url-host url) (url-filename url)) @@ -205,6 +206,10 @@ allows switching from an encrypted channel back to plain text without user input (when (or (equal (url-filename url) "") (equal (url-filename url) "/")) (setf (url-filename url) "/1"))) + (when (equal "gemini" (url-type url)) + ;; Gemini defaults + (if (equal (url-filename url) "") + (setf (url-filename url) "/")))) url) (set-match-data data)))) @@ -278,7 +283,15 @@ For gopher addresses this is a combination of the selector type and selector." (defun elpher-address-port (address) "Retrieve port from ADDRESS object." - (url-port address)) + (if (symbolp address) + nil) + (if (> (url-port address) 0) + (url-port address) + (or (and (or (equal (url-type address) "gopher") + (equal (url-type address) "gophers")) + 70) + (and (equal (url-type address) "gemini") + 1965)))) (defun elpher-address-special-p (address) "Return non-nil if ADDRESS object is special (e.g. start page, bookmarks page)." @@ -411,7 +424,14 @@ unless PRESERVE-PARENT is non-nil." (defun elpher-update-header () "If `elpher-use-header' is true, display current node info in window header." (if elpher-use-header - (setq header-line-format (elpher-node-display-string elpher-current-node)))) + (let* ((display-string (elpher-node-display-string elpher-current-node)) + (address (elpher-node-address elpher-current-node)) + (url-string (if (elpher-address-special-p address) + "" + (concat " - " (elpher-address-to-url address) ""))) + (header (replace-regexp-in-string "%" "%%" (concat display-string + url-string)))) + (setq header-line-format header)))) (defmacro elpher-with-clean-buffer (&rest args) "Evaluate ARGS with a clean *elpher* buffer as current." @@ -490,9 +510,7 @@ up to the calling function." (proc (open-network-stream "elpher-process" nil (elpher-address-host address) - (if (> (elpher-address-port address) 0) - (elpher-address-port address) - 70) + (elpher-address-port address) :type (if elpher-use-tls 'tls 'plain)))) (set-process-coding-system proc 'binary) (set-process-filter proc @@ -762,19 +780,18 @@ The response is stored in the variable ‘elpher-gemini-response’." (proc (open-network-stream "elpher-process" nil (elpher-address-host address) - (if (> (elpher-address-port address) 0) - (elpher-address-port address) - 1965) + (elpher-address-port address) :type 'tls))) - (set-process-coding-system proc 'binary) - (set-process-filter proc - (lambda (_proc string) - (setq elpher-gemini-response - (concat elpher-gemini-response string)))) - (set-process-sentinel proc after) - (process-send-string proc - (concat (elpher-address-to-url address) "\r\n"))))) - + (if (not (processp proc)) + (error "Error initiating network connection.") + (set-process-coding-system proc 'binary) + (set-process-filter proc + (lambda (_proc string) + (setq elpher-gemini-response + (concat elpher-gemini-response string)))) + (set-process-sentinel proc after) + (process-send-string proc + (concat (elpher-address-to-url address) "\r\n")))))) (defun elpher-process-gemini-response (renderer) "Process the gemini response and pass the result to RENDERER. @@ -813,14 +830,16 @@ The response is assumed to be in the variable `elpher-gemini-response'." renderer) (elpher-restore-pos)))))) (?4 ; Temporary failure - (error "Gemini server reports TEMPORARY FAILURE for this request")) + (error "Gemini server reports TEMPORARY FAILURE for this request: %S" + response-header)) (?5 ; Permanent failure - (error "Gemini server reports PERMANENT FAILURE for this request")) + (error "Gemini server reports PERMANENT FAILURE for this request: %S" + response-header)) (?6 ; Client certificate required (error "Gemini server requires client certificate (unsupported at this time)")) (_other - (error "Gemini server responded with unknown response code %S" - response-code)))) + (error "Gemini server responded with unknown response: %S" + response-header)))) (error (elpher-network-error (elpher-node-address elpher-current-node) the-error)))) @@ -895,7 +914,7 @@ The response is assumed to be in the variable `elpher-gemini-response'." (let ((address (url-generic-parse-url url))) (unless (and (url-type address) (not (url-fullness address))) ;avoid mangling mailto: urls (setf (url-fullness address) t) - (unless (url-host address) ;if there is an explicit host, filenames are explicit + (unless (url-host address) ;if there is an explicit host, filenames are absolute (setf (url-host address) (url-host (elpher-node-address elpher-current-node))) (unless (string-prefix-p "/" (url-filename address)) ;deal with relative links (setf (url-filename address)