aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2021-11-08 15:56:32 +0100
committerDaniel Schadt <kingdread@gmx.de>2021-11-08 16:00:34 +0100
commitc2827483f9d92c7abbc71a93c5a7607642826f1c (patch)
treecbf71648b96e13fc0ff09a58db10fb51f3c29570
parent7ae86ad2f32994791edcd4d4ac4ec8499034181f (diff)
downloadCana-c2827483f9d92c7abbc71a93c5a7607642826f1c.tar.gz
Cana-c2827483f9d92c7abbc71a93c5a7607642826f1c.tar.bz2
Cana-c2827483f9d92c7abbc71a93c5a7607642826f1c.zip
properly send close_notify after the response
This is already mandated by the TLS spec, but has been made explicit as well for Gemini servers[1]: > As per RFCs 5246 and 8446, Gemini servers MUST send a TLS > `close_notify` prior to closing the connection after sending a > complete response. This is essential to disambiguate completed > responses from responses closed prematurely due to network error or > attack. We want to be well-behaved, therefore we now send close_notify properly after writing a response. You can verify this easily using [2]. [1] https://gemini.circumlunar.space/docs/specification.html [2] https://portal.mozz.us/
-rw-r--r--src/Cana.hs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/Cana.hs b/src/Cana.hs
index 2e616ac..4d5c4d2 100644
--- a/src/Cana.hs
+++ b/src/Cana.hs
@@ -171,8 +171,13 @@ canaClient socket = do
}
-- | Render a response and write it to the TLS encrypted socket.
+--
+-- Note that this function also sends the TLS @close_notify@, as mandated by
+-- the TLS and the Gemini specifications.
writeResponse :: TLS.Context -> GeminiResponse -> Cana ()
-writeResponse context = TLS.sendData context . renderResponse
+writeResponse context response = do
+ TLS.sendData context $ renderResponse response
+ TLS.bye context
-- | Find the fitting route for the given request.
findRoute :: GeminiRequest -> Cana (Maybe Handler)