HTTP Deceiver

1.2.7 · abandoned · verified Tue Apr 21

http-deceiver is a low-level Node.js module specifically engineered to provide granular control over HTTP stream parsing, allowing developers to process or manipulate raw HTTP request and response data, including potentially malformed or unconventional payloads. This capability makes it suitable for advanced network debugging, security testing (e.g., fuzzing HTTP parsers), or implementing custom proxy solutions where standard HTTP modules might be too restrictive. The package's current stable version is 1.2.7. Given its last update approximately eight years ago (around 2018), it is effectively an abandoned project with no ongoing maintenance or active development. Its event-driven API operates by accepting raw buffer chunks and emitting 'header', 'data', and 'end' events, providing a programmatic interface to dissect and reassemble HTTP message components. Unlike higher-level HTTP client or server libraries, `http-deceiver` directly interacts with the byte stream, offering a unique approach for deep-level HTTP protocol inspection and modification.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to use `http-deceiver` to parse a raw HTTP request fed through a `net.Socket`. It sets up a simple `net` server to receive client data, passes that data to `Deceiver`, and listens for `header`, `data`, and `error` events, simulating deep packet inspection or custom HTTP handling.

const Deceiver = require('http-deceiver');
const net = require('net');

const rawHttpRequest = Buffer.from(
  'GET /malformed-path HTTP/1.1\r\n' +
  'Host: example.com\r\n' +
  'X-Custom-Header: potential-injection-attempt\r\n' +
  'Content-Length: 0\r\n' +
  '\r\n' // Note: A standard HTTP/1.1 request requires two CRLFs at the end of headers.
);

const server = net.createServer((socket) => {
  console.log('Client connected to server.');
  const deceiver = new Deceiver();

  deceiver.on('error', (err) => {
    console.error('Deceiver parsing error:', err.message);
    socket.end('HTTP/1.1 400 Bad Request\r\nContent-Type: text/plain\r\n\r\nDeceiver encountered a parsing error.\n');
  });

  deceiver.on('header', (header) => {
    console.log('Parsed Header:', header);
    // Example: Manipulate headers for a proxy or security scan
    if (header['x-custom-header'] && header['x-custom-header'].includes('injection')) {
      console.warn('Potential injection attempt detected in X-Custom-Header!');
    }
  });

  deceiver.on('data', (data) => {
    console.log('Parsed Data (body chunk):', data.toString());
  });

  deceiver.on('end', () => {
    console.log('Deceiver parsing ended successfully.');
    socket.write('HTTP/1.1 200 OK\r\nContent-Length: 18\r\nContent-Type: text/plain\r\n\r\nDeceiver processed it!\n');
    socket.end();
  });

  socket.on('data', (chunk) => {
    console.log('Received raw chunk from client:', chunk.toString().trim());
    deceiver.write(chunk); // Feed client data to the deceiver
  });

  socket.on('end', () => {
    console.log('Client disconnected from server.');
    deceiver.end(); // Signal end of input to the deceiver
  });
});

server.listen(3000, () => {
  console.log('Server listening on port 3000. Simulating client request...');

  const client = net.connect({ port: 3000 }, () => {
    console.log('Simulated client connected.');
    client.write(rawHttpRequest);
    client.end(); // End client connection after sending the request
  });

  client.on('data', (data) => {
    console.log('Simulated client received response:', data.toString().trim());
    server.close(); // Close server after receiving response
  });

  client.on('end', () => {
    console.log('Simulated client disconnected after response.');
  });
});

view raw JSON →