1// Copyright Joyent, Inc. and other Node contributors. 2// 3// Permission is hereby granted, free of charge, to any person obtaining a 4// copy of this software and associated documentation files (the 5// "Software"), to deal in the Software without restriction, including 6// without limitation the rights to use, copy, modify, merge, publish, 7// distribute, sublicense, and/or sell copies of the Software, and to permit 8// persons to whom the Software is furnished to do so, subject to the 9// following conditions: 10// 11// The above copyright notice and this permission notice shall be included 12// in all copies or substantial portions of the Software. 13// 14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20// USE OR OTHER DEALINGS IN THE SOFTWARE. 21 22'use strict'; 23const common = require('../common'); 24const http = require('http'); 25 26const CRLF = '\r\n'; 27 28const server = http.createServer(); 29server.on('upgrade', function(req, socket) { 30 socket.write(`HTTP/1.1 101 Ok${CRLF}` + 31 `Connection: Upgrade${CRLF}` + 32 `Upgrade: Test${CRLF}${CRLF}` + 33 'head'); 34 socket.on('end', function() { 35 socket.end(); 36 }); 37}); 38 39server.listen(0, common.mustCall(function() { 40 41 function upgradeRequest(fn) { 42 console.log('req'); 43 const header = { 'Connection': 'Upgrade', 'Upgrade': 'Test' }; 44 const request = http.request({ 45 port: server.address().port, 46 headers: header 47 }); 48 let wasUpgrade = false; 49 50 function onUpgrade(res, socket) { 51 console.log('client upgraded'); 52 wasUpgrade = true; 53 54 request.removeListener('upgrade', onUpgrade); 55 socket.end(); 56 } 57 request.on('upgrade', onUpgrade); 58 59 function onEnd() { 60 console.log('client end'); 61 request.removeListener('end', onEnd); 62 if (!wasUpgrade) { 63 throw new Error('hasn\'t received upgrade event'); 64 } else { 65 fn && process.nextTick(fn); 66 } 67 } 68 request.on('close', onEnd); 69 70 request.write('head'); 71 72 } 73 74 upgradeRequest(common.mustCall(function() { 75 upgradeRequest(common.mustCall(function() { 76 // Test pass 77 console.log('Pass!'); 78 server.close(); 79 })); 80 })); 81})); 82