|
|
@ -25,41 +25,153 @@ var net = require('net'); |
|
|
|
var http = require('http'); |
|
|
|
|
|
|
|
var body = 'hello world\n'; |
|
|
|
var server_response = ''; |
|
|
|
var client_got_eof = false; |
|
|
|
|
|
|
|
var server = http.createServer(function(req, res) { |
|
|
|
assert.equal('1.0', req.httpVersion); |
|
|
|
assert.equal(1, req.httpVersionMajor); |
|
|
|
assert.equal(0, req.httpVersionMinor); |
|
|
|
res.writeHead(200, {'Content-Type': 'text/plain'}); |
|
|
|
res.end(body); |
|
|
|
}); |
|
|
|
server.listen(common.PORT); |
|
|
|
var common_port = common.PORT; |
|
|
|
|
|
|
|
server.addListener('listening', function() { |
|
|
|
var c = net.createConnection(common.PORT); |
|
|
|
function test(handler, request_generator, response_validator) { |
|
|
|
var port = common_port++; |
|
|
|
var server = http.createServer(handler); |
|
|
|
|
|
|
|
c.setEncoding('utf8'); |
|
|
|
var client_got_eof = false; |
|
|
|
var server_response = { |
|
|
|
data: '', |
|
|
|
chunks: [] |
|
|
|
}; |
|
|
|
|
|
|
|
c.addListener('connect', function() { |
|
|
|
c.write('GET / HTTP/1.0\r\n\r\n'); |
|
|
|
}); |
|
|
|
function cleanup() { |
|
|
|
server.close(); |
|
|
|
response_validator(server_response, client_got_eof, true); |
|
|
|
} |
|
|
|
var timer = setTimeout(cleanup, 1000); |
|
|
|
process.on('exit', cleanup); |
|
|
|
|
|
|
|
c.addListener('data', function(chunk) { |
|
|
|
console.log(chunk); |
|
|
|
server_response += chunk; |
|
|
|
}); |
|
|
|
server.listen(port); |
|
|
|
server.on('listening', function() { |
|
|
|
var c = net.createConnection(port); |
|
|
|
|
|
|
|
c.addListener('end', function() { |
|
|
|
client_got_eof = true; |
|
|
|
c.end(); |
|
|
|
server.close(); |
|
|
|
c.setEncoding('utf8'); |
|
|
|
|
|
|
|
c.on('connect', function() { |
|
|
|
c.write(request_generator()); |
|
|
|
}); |
|
|
|
|
|
|
|
c.on('data', function(chunk) { |
|
|
|
server_response.data += chunk; |
|
|
|
server_response.chunks.push(chunk); |
|
|
|
}); |
|
|
|
|
|
|
|
c.on('end', function() { |
|
|
|
client_got_eof = true; |
|
|
|
c.end(); |
|
|
|
server.close(); |
|
|
|
clearTimeout(timer); |
|
|
|
process.removeListener('exit', cleanup); |
|
|
|
response_validator(server_response, client_got_eof, false); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
(function() { |
|
|
|
function handler(req, res) { |
|
|
|
assert.equal('1.0', req.httpVersion); |
|
|
|
assert.equal(1, req.httpVersionMajor); |
|
|
|
assert.equal(0, req.httpVersionMinor); |
|
|
|
res.writeHead(200, {'Content-Type': 'text/plain'}); |
|
|
|
res.end(body); |
|
|
|
} |
|
|
|
|
|
|
|
function request_generator() { |
|
|
|
return 'GET / HTTP/1.0\r\n\r\n'; |
|
|
|
} |
|
|
|
|
|
|
|
function response_validator(server_response, client_got_eof, timed_out) { |
|
|
|
var m = server_response.data.split('\r\n\r\n'); |
|
|
|
assert.equal(m[1], body); |
|
|
|
assert.equal(true, client_got_eof); |
|
|
|
assert.equal(false, timed_out); |
|
|
|
} |
|
|
|
|
|
|
|
test(handler, request_generator, response_validator); |
|
|
|
})(); |
|
|
|
|
|
|
|
//
|
|
|
|
// Don't send HTTP/1.1 status lines to HTTP/1.0 clients.
|
|
|
|
//
|
|
|
|
// https://github.com/joyent/node/issues/1234
|
|
|
|
//
|
|
|
|
(function() { |
|
|
|
function handler(req, res) { |
|
|
|
assert.equal('1.0', req.httpVersion); |
|
|
|
assert.equal(1, req.httpVersionMajor); |
|
|
|
assert.equal(0, req.httpVersionMinor); |
|
|
|
res.writeHead(200, {'Content-Type': 'text/plain'}); |
|
|
|
res.write("Hello, "); res._send(''); |
|
|
|
res.write("world!"); res._send(''); |
|
|
|
res.end(); |
|
|
|
} |
|
|
|
|
|
|
|
function request_generator() { |
|
|
|
return ("GET / HTTP/1.0\r\n" |
|
|
|
+ "User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15\r\n" |
|
|
|
+ "Host: 127.0.0.1:1337\r\n" |
|
|
|
+ "Accept: */*\r\n" |
|
|
|
+ "\r\n"); |
|
|
|
} |
|
|
|
|
|
|
|
function response_validator(server_response, client_got_eof, timed_out) { |
|
|
|
var expected_response = ("HTTP/1.0 200 OK\r\n" |
|
|
|
+ "Content-Type: text/plain\r\n" |
|
|
|
+ "Connection: close\r\n" |
|
|
|
+ "\r\n" |
|
|
|
+ "Hello, world!"); |
|
|
|
|
|
|
|
assert.equal(expected_response, server_response.data); |
|
|
|
assert.equal(1, server_response.chunks.length); |
|
|
|
assert.equal(true, client_got_eof); |
|
|
|
assert.equal(false, timed_out); |
|
|
|
} |
|
|
|
|
|
|
|
test(handler, request_generator, response_validator); |
|
|
|
})(); |
|
|
|
|
|
|
|
(function() { |
|
|
|
function handler(req, res) { |
|
|
|
assert.equal('1.1', req.httpVersion); |
|
|
|
assert.equal(1, req.httpVersionMajor); |
|
|
|
assert.equal(1, req.httpVersionMinor); |
|
|
|
res.writeHead(200, {'Content-Type': 'text/plain'}); |
|
|
|
res.write("Hello, "); res._send(''); |
|
|
|
res.write("world!"); res._send(''); |
|
|
|
res.end(); |
|
|
|
} |
|
|
|
|
|
|
|
function request_generator() { |
|
|
|
return ("GET / HTTP/1.1\r\n" |
|
|
|
+ "User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15\r\n" |
|
|
|
+ "Connection: close\r\n" |
|
|
|
+ "Host: 127.0.0.1:1337\r\n" |
|
|
|
+ "Accept: */*\r\n" |
|
|
|
+ "\r\n"); |
|
|
|
} |
|
|
|
|
|
|
|
function response_validator(server_response, client_got_eof, timed_out) { |
|
|
|
var expected_response = ("HTTP/1.1 200 OK\r\n" |
|
|
|
+ "Content-Type: text/plain\r\n" |
|
|
|
+ "Connection: close\r\n" |
|
|
|
+ "Transfer-Encoding: chunked\r\n" |
|
|
|
+ "\r\n" |
|
|
|
+ "7\r\n" |
|
|
|
+ "Hello, \r\n" |
|
|
|
+ "6\r\n" |
|
|
|
+ "world!\r\n" |
|
|
|
+ "0\r\n" |
|
|
|
+ "\r\n"); |
|
|
|
|
|
|
|
assert.equal(expected_response, server_response.data); |
|
|
|
assert.equal(1, server_response.chunks.length); |
|
|
|
assert.equal(true, client_got_eof); |
|
|
|
assert.equal(false, timed_out); |
|
|
|
} |
|
|
|
|
|
|
|
process.addListener('exit', function() { |
|
|
|
var m = server_response.split('\r\n\r\n'); |
|
|
|
assert.equal(m[1], body); |
|
|
|
assert.equal(true, client_got_eof); |
|
|
|
}); |
|
|
|
test(handler, request_generator, response_validator); |
|
|
|
})(); |