Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame^] | 1 | var common = require('../common'); |
Ryan Dahl | a0159b4 | 2010-12-04 23:20:34 | [diff] [blame] | 2 | var assert = require('assert'); |
| 3 | var http = require('http'); |
| 4 | |
| 5 | var CRLF = '\r\n'; |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 6 | |
| 7 | var server = http.createServer(); |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 8 | server.on('upgrade', function(req, socket, head) { |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 9 | socket.write('HTTP/1.1 101 Ok' + CRLF + |
| 10 | 'Connection: Upgrade' + CRLF + |
| 11 | 'Upgrade: Test' + CRLF + CRLF + 'head'); |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame^] | 12 | socket.on('end', function() { |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 13 | socket.end(); |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 14 | }); |
| 15 | }); |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 16 | |
Ryan Dahl | a0159b4 | 2010-12-04 23:20:34 | [diff] [blame] | 17 | var successCount = 0; |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 18 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame^] | 19 | server.listen(common.PORT, function() { |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 20 | |
| 21 | var client = http.createClient(common.PORT); |
| 22 | |
| 23 | function upgradeRequest(fn) { |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 24 | var header = { 'Connection': 'Upgrade', 'Upgrade': 'Test' }; |
| 25 | var request = client.request('GET', '/', header); |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 26 | var wasUpgrade = false; |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 27 | |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 28 | function onUpgrade(res, socket, head) { |
| 29 | wasUpgrade = true; |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 30 | |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 31 | client.removeListener('upgrade', onUpgrade); |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 32 | socket.end(); |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 33 | } |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 34 | client.on('upgrade', onUpgrade); |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 35 | |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 36 | function onEnd() { |
| 37 | client.removeListener('end', onEnd); |
| 38 | if (!wasUpgrade) { |
| 39 | throw new Error('hasn\'t received upgrade event'); |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 40 | } else { |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 41 | fn && process.nextTick(fn); |
| 42 | } |
| 43 | } |
| 44 | client.on('end', onEnd); |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 45 | |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 46 | request.write('head'); |
| 47 | |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 48 | } |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 49 | |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 50 | upgradeRequest(function() { |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 51 | successCount++; |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 52 | upgradeRequest(function() { |
Ryan Dahl | 3fceb49 | 2010-11-29 23:22:48 | [diff] [blame] | 53 | successCount++; |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 54 | // Test pass |
| 55 | console.log('Pass!'); |
| 56 | client.end(); |
| 57 | client.destroy(); |
| 58 | server.close(); |
| 59 | }); |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 60 | }); |
Ryan Dahl | 40f675b | 2010-10-18 22:05:18 | [diff] [blame] | 61 | |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 62 | }); |
| 63 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame^] | 64 | process.on('exit', function() { |
Fedor Indutny | 5535aa3 | 2010-09-22 12:51:53 | [diff] [blame] | 65 | assert.equal(2, successCount); |
| 66 | }); |