From 1b5af6f4bdfca939e780ae70bd6e1819425824f7 Mon Sep 17 00:00:00 2001 From: Jannis R Date: Sat, 2 May 2020 15:32:36 +0200 Subject: move code, server example :memo: --- lib/parser.js | 78 ----------------------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 lib/parser.js (limited to 'lib/parser.js') diff --git a/lib/parser.js b/lib/parser.js deleted file mode 100644 index a66a323..0000000 --- a/lib/parser.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict' - -const {Transform} = require('stream') -const {MESSAGES} = require('./statuses') - -// https://gemini.circumlunar.space/docs/spec-spec.txt, 1.2 -// > Gemini requests are a single CRLF-terminated line with the -// > following structure: -// > is a UTF-8 encoded absolute URL, of maximum length -// > 1024 bytes. [...] - -const CRLF = '\r\n' -const MAX_HEADER_SIZE = 1024 + CRLF.length - -const createParser = () => { - let headerParsed = false - let peek = Buffer.alloc(0) - - const invalid = () => { - peek = null - out.destroy(new Error('invalid Gemini request')) - } - - const onData = (data) => { - if (headerParsed) { - out.push(data) - return; - } - - peek = Buffer.concat([peek, data], peek.length + data.length) - if ( - data.indexOf(CRLF) < 0 && - peek.length < MAX_HEADER_SIZE - ) return; // keep peeking - - const iCRLF = peek.indexOf(CRLF) - if (iCRLF < 0) return invalid() - - const url = peek.slice(0, iCRLF).toString('utf8') - headerParsed = true - out.emit('header', {url}) - - const iBody = iCRLF + 2 - if (peek.length > (iBody + 1)) { - // `data` contains the beginning of the body - out.push(peek.slice(iBody)) - } - peek = null // allow garbage collection - } - - const out = new Transform({ - write: (chunk, _, cb) => { - onData(chunk) - cb() - }, - writev: (chunks, cb) => { - for (let i = 0; i < chunks.length; i++) { - onData(chunks[i].chunk) - } - cb() - }, - }) - return out -} - -// const p = createParser() -// p.on('error', console.error) -// p.on('header', h => console.log('header', h)) -// p.on('data', d => console.log('data', d.toString('utf8'))) -// const b = str => Buffer.from(str, 'utf8') -// p.write(b('gemini://examp')) -// p.write(b('le.org/foo?bar#baz\r\nhel')) -// p.end(b('lo server!')) - -module.exports = { - MESSAGES, - createParser, -} -- cgit v1.3