UNPKG

httpao

Version:

Simple, lighweight http server module

74 lines (67 loc) 1.89 kB
const EventEmitter = require('events'), {Socket} = require('net'); const ksocket = Symbol('socket'); const ehb = Buffer.from('\r\n\r\n'); class InComing extends EventEmitter { constructor (socket) { if (!(socket instanceof Socket)) throw new TypeError('socket not a Socket instance'); super(); this[ksocket] = socket; this.httpVersion = null; this.method = null; this.url = ''; this.headers = {}; this.rawHeaders = []; this.complete = false; var bh = [], rvh, i, h, ps, bd; socket.on('data', d => { i = d.indexOf(ehb); if (!rvh && i >= 0) { rvh = true; ps = true; h = d.slice(0, i); this._parse(h); bd = d.slice(i + ehb.length); bd.length > 0 ? this.emit('data', bd) : ''; } else if (rvh) { d.length > 0 ? this.emit('data', d) : ''; } else { bh.push(d); } }); socket.on('end', () => { if (!ps) { bh = Buffer.concat(bh); this._parse(bh); } this.complete = true; this.emit('end'); }); socket.on('close', () => { this.aborted = true; this.emit('aborted'); this.emit('close'); }); } setTimeout(ms, cb) { this[ksocket].setTimeout(ms, cb); } _parse (h) { h = h.toString('utf8').split('\r\n'); var fh = h[0].split(' '), s, k, v; this.method = fh[0]; this.url = fh[1]; this.httpVersion = fh[2].split('/')[1]; for (var i = 1; i < h.length; i++) { s = h[i].split(':'); k = s.shift(); v = s.join(':').trim(); this.headers[k.toLowerCase()] = v; this.rawHeaders.push(k, v); } this.emit('parsed'); } } module.exports = InComing;