httpao
Version:
Simple, lighweight http server module
74 lines (67 loc) • 1.89 kB
JavaScript
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;