💾 Archived View for gem.benscraft.info › mailing-list › messages › 252 captured on 2021-12-05 at 23:47:19. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2021-12-03)

-=-=-=-=-=-=-

Re: [tech] tls user_canceled issue with Java server + Go client

- Gary Johnson <lambdatronic at disroot.org>

@ Sat, 17 Apr 2021 20:04 -0400

Full Thread

Reply to Alan <gemini at bunburya.eu>

────────────────────────────────────────────────────────────────────────────────

Alan <gemini@bunburya.eu> writes:

When using the Amfora browser, I was unable to view "20" responses,
getting instead the following error: "/Issuing creating page: remote
error: tls: user//canceled/". Unusually, every other response is
displayed fine.

Hi Alan,

I'm the author of Space-Age, a Gemini server written in Clojure.

https://gitlab.com/lambdatronic/space-age/

The tls_user_canceled issue you are running into is coming from the Java

side. It also mystified me last year when I was writing my server since

I was constantly getting that error in elpher (the Emacs Gemini client)

whenever I tried to browse pages from my capsule.

You have to force your SSLSocket to send the tls_close_notify alert to

the client before closing the socket. This is exceptionally poorly

documented in the JSSE Reference Guide, but I eventually figured out the

solution through trial and error.

All you need to do is to make sure you call socket.shutdownOutput()

immediately before calling socket.close().

Here's my function for writing a Gemini response back to the client for reference:

(defn- write-socket! [^SSLSocket socket {:keys [status meta body]}]
  (doto (io/writer socket)
    (.write (str status " " meta "\r\n"))
    (.flush))
  (when body
    (with-open [in-stream (io/input-stream (if (string? body)
                                             (.getBytes ^String body)
                                             body))]
      (let [out-stream (io/output-stream socket)]
        (.transferTo in-stream out-stream)
        (.flush out-stream))))
  (.shutdownOutput socket))

This is called from another function that then calls socket.close() to

terminate the connection.

Here is my full Gemini server implementation for further reference:

https://gitlab.com/lambdatronic/space-age/-/blob/master/src/space_age/server.clj

Happy hacking!

Gary

--

GPG Key ID: 7BC158ED

Use `gpg --search-keys lambdatronic' to find me

Protect yourself from surveillance: https://emailselfdefense.fsf.org

=======================================================================

() ascii ribbon campaign - against html e-mail

/\ www.asciiribbon.org - against proprietary attachments

Why is HTML email a security nightmare? See https://useplaintext.email/

Please avoid sending me MS-Office attachments.

See http://www.gnu.org/philosophy/no-word-attachments.html

════════════════════════════════════════════════════════════════════════════════

Replies

Reply from Alan <gemini at bunburya.eu>