具有TLSSocket和tls.connect的Node中的奇怪行爲。節點4.1.0 TLSSocket問題
var port = 7000;
var host = '94.125.182.252'; //freenode
var tls = require('tls');
var net = require('net');
var socket = new net.Socket();
var secure;
secure = new tls.TLSSocket(socket, {
isServer: false,
rejectUnauthorized: false
});
// edit (left out of original post, but present in my test code, whoops)
secure.connect({
port: port,
host: host
});
secure.setEncoding('utf8');
secure.on('connect' , function() {
console.log('connected');
})
.on('secureConnect', function() {
console.log('secure connect');
})
.on('error', function(e) {
console.log('error', e);
})
.on('data', function(data) {
console.log(data);
});
if (secure.isPaused()) {
console.log('socket was paused');
secure.resume();
}
這甚至不嘗試連接並且不會產生錯誤消息。我有wireshark監控,並沒有捕獲活動。
一種不同的方法:
secure = tls.connect({
rejectUnauthorized: false,
host: host,
port: port,
socket: socket
});
同樣的故事,沒有捕捉到,沒有錯誤。如果我刪除上面socket: socket
方面它將連接。這是有道理的,因爲文檔聲明如果指定套接字選項,它將忽略端口和主機。上述工作在我以前的Node版本(0.12.7)上。
如果我想使用現有的套接字,我必須告訴它在連接tls.connect之前進行連接。
socket.connect({
port: port,
host: host
});
secure = tls.connect({
rejectUnauthorized: false,
socket: socket
});
這似乎並不合適。 將連接套接字傳遞給tls.TLSSocket(套接字,...)似乎沒有效果。 「連接」事件被解僱,但我想這與TLSSocket無關。 我無法使tls.TLSSocket(...)在之前的節點迭代上工作。 單步執行節點調試沒有發現任何明顯的問題。
net.Socket([options])的選項似乎不接受配置的端口或主機,直到您嘗試連接,並且在傳遞給tls.connect之前嘗試連接似乎違反直覺。這表明這不是預期的用法。
所以我的問題是:
我在做什麼毛病tls.TLSSocket()或許是一個錯誤嗎?
我正確地認爲,將現有套接字傳遞到tls.connect()是爲了建立連接切換協議嗎?如果不是,分配端口和主機的正確方法是什麼?
編輯:
按照建議:
secure = tls.connect({
rejectUnauthorized: false,
socket: socket
});
socket.connect({
port: port,
host: host
});
這工作。
secure = new tls.TLSSocket(socket , {
isServer: false,
rejectUnauthorized: false
});
socket.connect({
port: port,
host: host
});
不幸的是,這是行不通的。發出'連接'事件,絕不會發生'secureConnect'事件,也不會發生任何其他事件或數據。