Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
A `StreamStack` implementation of the HTTP protocol, for NodeJS.
JavaScript
Branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
examples
test
LICENSE
README.md
base.js
index.js
package.json
request.js
response.js
server.js

README.md

node-http-stack

A StreamStack implementation of the HTTP protocol for Node.

This module exposes two concrete StreamStack implementations: HttpRequestStack and HttpResponseStack. Together they can be used to write and/or respond to HTTP requests.

This is an alternative to the built-in core http module. It is designed to be more lenient, as well as being written with the StreamStack ideology.

HTTP Request

In this typical example, we'll establish a net.Stream connection to www.google.com on port 80 and send an HTTP request for /:

var conn = require('net').createConnection(80, 'www.google.com');
conn.on("connect", function() {

  var req = new HttpRequestStack(conn);

  // 'response' gets emitted when the HTTP headers have been recieved
  req.on("response", function(res) {
    console.error(res.headers);
  });

  // The body of the response will be piped to 'stdout'
  req.pipe(process.stdout);

  // Initiate a GET request for '/' with no request body
  req.get("/", [
    "Host: www.google.com"
  ]);
  req.end();

});

Instead, in this example, we'll write() a request to stdout. Don't expect there to be any response, but it's useful to see what's being written:

var request = new HttpRequestStack(process.stdout);

// Write an HTTP post request to stdout
var body = "hello!\n";
request.post("/", [
  "Content-Length: " + body.length,
  "Content-Type: text/plain",
  "Host: example.com"
]);
request.end(body);

--> POST / HTTP/1.1
--> Content-Length: 7
--> Content-Type: text/plain
--> Host: example.com
-->
--> hello!

HTTP Response

You can use HttpResponseStacks to respond to HTTP requests from a net.Server:

require('net').createServer(function(stream) {

  var res = new HttpResponseStack(stream);

  // 'request' is emitted when HTTP headers from a request have been parsed
  res.on("request", function(request) {
    res.writeHead(200, [
      'Content-Type: text/plain'
    ]);
    res.end('Hello World\n');        
  });

}).listen(8124, 'localhost');

TODO

  • Chunked encoding/decoding
  • Keep-Alive (needs chunked encoding)
  • Testing...
Something went wrong with that request. Please try again.