mirror of https://github.com/lukechilds/node.git
Thomas Lee
15 years ago
committed by
Ryan Dahl
2 changed files with 118 additions and 16 deletions
@ -0,0 +1,95 @@ |
|||||
|
require("../common"); |
||||
|
http = require("http"); |
||||
|
url = require("url"); |
||||
|
|
||||
|
//
|
||||
|
// Slight variation on test-http-client-race to test for another race
|
||||
|
// condition involving the parsers FreeList used internally by http.Client.
|
||||
|
//
|
||||
|
|
||||
|
var body1_s = "1111111111111111"; |
||||
|
var body2_s = "22222"; |
||||
|
var body3_s = "3333333333333333333"; |
||||
|
|
||||
|
var server = http.createServer(function (req, res) { |
||||
|
var pathname = url.parse(req.url).pathname; |
||||
|
|
||||
|
var body; |
||||
|
switch (pathname) { |
||||
|
case "/1": body = body1_s; break; |
||||
|
case "/2": body = body2_s; break; |
||||
|
default: body = body3_s; |
||||
|
}; |
||||
|
|
||||
|
res.writeHead(200, { "Content-Type": "text/plain" |
||||
|
, "Content-Length": body.length |
||||
|
}); |
||||
|
res.end(body); |
||||
|
}); |
||||
|
server.listen(PORT); |
||||
|
|
||||
|
var client = http.createClient(PORT); |
||||
|
|
||||
|
var body1 = ""; |
||||
|
var body2 = ""; |
||||
|
var body3 = ""; |
||||
|
|
||||
|
//
|
||||
|
// Client #1 is assigned Parser #1
|
||||
|
//
|
||||
|
var req1 = client.request("/1") |
||||
|
req1.addListener('response', function (res1) { |
||||
|
res1.setBodyEncoding("utf8"); |
||||
|
|
||||
|
res1.addListener('data', function (chunk) { |
||||
|
body1 += chunk; |
||||
|
}); |
||||
|
|
||||
|
res1.addListener('end', function () { |
||||
|
//
|
||||
|
// Delay execution a little to allow the "close" event to be processed
|
||||
|
// (required to trigger this bug!)
|
||||
|
//
|
||||
|
setTimeout(function () { |
||||
|
//
|
||||
|
// The bug would introduce itself here: Client #2 would be allocated the
|
||||
|
// parser that previously belonged to Client #1. But we're not finished
|
||||
|
// with Client #1 yet!
|
||||
|
//
|
||||
|
var client2 = http.createClient(PORT); |
||||
|
|
||||
|
//
|
||||
|
// At this point, the bug would manifest itself and crash because the
|
||||
|
// internal state of the parser was no longer valid for use by Client #1.
|
||||
|
//
|
||||
|
var req2 = client.request("/2"); |
||||
|
req2.addListener('response', function (res2) { |
||||
|
res2.setBodyEncoding("utf8"); |
||||
|
res2.addListener('data', function (chunk) { body2 += chunk; }); |
||||
|
res2.addListener('end', function () { |
||||
|
|
||||
|
//
|
||||
|
// Just to be really sure we've covered all our bases, execute a
|
||||
|
// request using client2.
|
||||
|
//
|
||||
|
var req3 = client2.request("/3"); |
||||
|
req3.addListener('response', function (res3) { |
||||
|
res3.setBodyEncoding("utf8"); |
||||
|
res3.addListener('data', function (chunk) { body3 += chunk }); |
||||
|
res3.addListener('end', function() { server.close(); }); |
||||
|
}); |
||||
|
req3.end(); |
||||
|
}); |
||||
|
}); |
||||
|
req2.end(); |
||||
|
}, 500); |
||||
|
}); |
||||
|
}); |
||||
|
req1.end(); |
||||
|
|
||||
|
process.addListener("exit", function () { |
||||
|
assert.equal(body1_s, body1); |
||||
|
assert.equal(body2_s, body2); |
||||
|
assert.equal(body3_s, body3); |
||||
|
}); |
||||
|
|
Loading…
Reference in new issue