summaryrefslogtreecommitdiffstats
path: root/server.js
diff options
context:
space:
mode:
authorJannis R <mail@jannisr.de>2020-10-16 14:49:33 +0200
committerJannis R <mail@jannisr.de>2020-10-16 14:54:06 +0200
commit0fdbefbb86bcf959875358b732682af65eddacc2 (patch)
treed90331d804f81ac346ab5470463bee4dd9dd91b4 /server.js
parent756519148e19a310f3f30328cbd5e09d99db2190 (diff)
client & server: improved error handling & timeouts 🐛
Diffstat (limited to 'server.js')
-rw-r--r--server.js39
1 files changed, 24 insertions, 15 deletions
diff --git a/server.js b/server.js
index 4bb2cef..1dc5905 100644
--- a/server.js
+++ b/server.js
@@ -3,6 +3,7 @@
const debug = require('debug')('gemini:server')
const {createServer: createTlsServer} = require('tls')
const {EventEmitter} = require('events')
+const {pipeline: pipe} = require('stream')
const createParser = require('./lib/request-parser')
const createResponse = require('./lib/response')
const {
@@ -49,20 +50,26 @@ const createGeminiServer = (opt = {}, onRequest) => {
const clientCert = socket.getPeerCertificate()
const req = createParser()
- socket.pipe(req)
- socket.once('error', (err) => {
- socket.unpipe(req)
- req.destroy(err)
- })
+ pipe(
+ socket,
+ req,
+ (err) => {
+ if (err) debug('error receiving request', err)
+ if (timeout && err) {
+ debug('socket closed while waiting for header')
+ }
+ // todo? https://nodejs.org/api/http.html#http_event_clienterror
+ },
+ )
- const close = () => {
- socket.destroy()
- req.destroy()
+ const reportTimeout = () => {
+ socket.destroy(new Error('timeout waiting for header'))
}
- let timeout = setTimeout(close, 20 * 1000)
+ let timeout = setTimeout(reportTimeout, 20 * 1000)
req.once('header', (header) => {
clearTimeout(timeout)
+ timeout = null
debug('received header', header)
// prepare req
@@ -77,14 +84,16 @@ const createGeminiServer = (opt = {}, onRequest) => {
// prepare res
const res = createResponse()
- res.pipe(socket)
- res.once('error', (err) => {
- console.error('error', err)
- res.unpipe(socket)
- socket.destroy(err)
- })
Object.defineProperty(res, 'socket', {value: socket})
+ pipe(
+ res,
+ socket,
+ (err) => {
+ if (err) debug('error sending response', err)
+ },
+ )
+
onRequest(req, res)
server.emit('request', req, res)
})