var http = require("http")
  , util = require("sys") // 0.3.x: require("util")
  , fs = require("fs")
  , client = http.createClient(80, "example.com")
  , request = client.request("POST", "/", {"host":"example.com"})

// send body chunks
request.write("hello, world")

// pump a file through
// You'd normally have to call request.end() to actually
// have it send out, but the pump will .end() when the file is done.
// 0.3.x: fs.createReadStream(__filename).pipe(request)
util.pump(fs.createReadStream(__filename), request)


request.on("response", function (response) {
  // got a response
  console.log("response: "+response.statusCode)
  console.log(util.inspect(response.headers))
  // read the body
  // could listen to "data" and "end" manually, or just pump somewhere
  // pumping *into* stdout is kinda lame, because it closes it at the end.
  util.pump(response, process.stdout)

  // this is how to buffer it. not usually the right thing to do.
  // note that an array of buffers is used rather than one big string,
  // so that we don't get bitten by multibyte chars on the boundaries,
  // or take the performance hit of copying the data to/from v8's heap twice.
  // (once to put it into the string, then to get it out later)
  var bodyParts = []
    , bytes = 0
  response.on("data", function (c) {
    bodyParts.push(c)
    bytes += c.length
  })
  response.on("end", function () {
    // flatten into one big buffer
    // it'd be cooler if fs.writeFile et al could take an array
    // of buffers and use writev, but alas, not at this time.
    console.error(bytes, typeof bytes)
    var body = new Buffer(bytes)
      , copied = 0
    bodyParts.forEach(function (b) {
      b.copy(body, copied, 0)
      copied += b.length
    })
    fs.writeFile("the-response", body, function (er) {
      if (er) {
        console.error(er.stack || er.message)
        return process.exit(1)
      }
      console.error("ok")
    })
  })
 })