💾 Archived View for rawtext.club › ~sloum › geminilist › 006387.gmi captured on 2023-11-14 at 09:24:52. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2021-11-30)

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

<-- back to the mailing list

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

Alan gemini at bunburya.eu

Sun Apr 18 15:41:13 BST 2021

- - - - - - - - - - - - - - - - - - - 

Hi Gary,

That solved it, thanks! A simple fix but you're right, I couldn't find anything about it. Good to know there is a solution.

Thanks,

Alan

On 18/04/2021 01:04, Gary Johnson wrote:

Alan<gemini at 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