Как уже говорили, библиотека HTTP-сервера Node.js настроена на прием только определенных глаголов. Предложение Бен Нурдиуса об использовании Петрушка также не работает, так как эта библиотека принимает еще меньший белый список глаголов. (Это также не поддерживалось в течение долгого времени.)
На этом этапе, если мы хотим поддержать запросы на странный мяч, мы должны принять более решительные меры. Вот хороший уродливый хак для вас, который включает в себя утку, пробивающую внутреннее поведение. Это работает на v0.10.x Node.js, но тщательно проверяйте новые версии по мере их появления.
В моем случае мне нужно было поддерживать не только нестандартный глагол, но и нестандартный идентификатор версии протокола, а также отсутствующий заголовок Content-Length
для исходных потоков Icecast:
SOURCE /live ICE/1.0
Следующее должно вас начать:
server.on('connection', function (socket) {
var originalOnDataFunction = socket.ondata;
var newLineOffset;
var receiveBuffer = new Buffer(0);
socket.ondata = function (d, start, end) {
receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
if ((newLineOffset = receiveBuffer.toString('ascii').indexOf('\n')) > -1) {
var firstLineParts = receiveBuffer.slice(0, newLineOffset).toString().split(' ');
firstLineParts[0] = firstLineParts[0].replace(/^SOURCE$/ig, 'PUT');
firstLineParts[2] = firstLineParts[2].replace(/^ICE\//ig, 'HTTP/');
receiveBuffer = Buffer.concat([
new Buffer(
firstLineParts.join(' ') + '\r\n' +
'Content-Length: 9007199254740992\r\n'
),
receiveBuffer.slice(newLineOffset +1)
]);
socket.ondata = originalOnDataFunction;
socket.ondata.apply(this, [receiveBuffer, 0, receiveBuffer.length]);
}
};
}
Это некрасиво, но работает. Меня это не особо радует, но при выборе грубого встроенного парсера HTTP или настройки существующего я в этом случае хочу настроить.