diff --git a/test/simple/test-http-1.0.js b/test/simple/test-http-1.0.js index 7d3cca78be..3e06d01083 100644 --- a/test/simple/test-http-1.0.js +++ b/test/simple/test-http-1.0.js @@ -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); +})(); \ No newline at end of file