រុំ SOCKS socket ជាមួយ TLS ក្នុង Node.js
រុំ destination stream ដែលកញ្ចប់ socks ត្រឡប់មកវិញដោយ tls.connect និងរក្សា hostname របស់គេហទំព័រសម្រាប់ SNI និងការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រ។
SocksClient.createConnection ត្រឡប់ stream ដែលភ្ជាប់ទៅ destination ដែលបានស្នើ។ សម្រាប់ HTTPS stream នោះនៅតែត្រូវការ TLS handshake មុនពេលវាផ្ទុកសំណើ HTTP។
import { SocksClient } from 'socks';
import tls from 'node:tls';
const targetHost = 'service.example';
const info = await SocksClient.createConnection({
proxy: { host: 'proxy.example', port: 1080, type: 5 },
command: 'connect',
destination: { host: targetHost, port: 443 },
timeout: 10000,
});
const secure = tls.connect({
socket: info.socket,
servername: targetHost,
});
secure.on('error', onTransportError);
secure.on('data', onResponseBytes);
secure.once('secureConnect', () => {
secure.write(
`GET /data HTTP/1.1\r\nHost: ${targetHost}\r\nConnection: close\r\n\r\n`
);
});
បញ្ជី proxy SOCKS5 ផ្តល់បេក្ខជនសម្រាប់ host និង port របស់ proxy។ onTransportError និង onResponseBytes ជាកម្មសិទ្ធិរបស់កម្មវិធីដែលមានស្រាប់; ទីពីរត្រូវញែក stream នៃការឆ្លើយតប HTTP។ បំណែកទិន្នន័យ TLS មិនមែនជាសារ HTTP ពេញលេញដោយឯករាជ្យទេ។
servername គឺជាឈ្មោះ DNS របស់ destination។ tls.connect កម្រិតទាបរបស់ Node មិនបើក SNI តាមលំនាំដើមទេ ហើយ hostname របស់ proxy មិនមែនជាអត្តសញ្ញាណវិញ្ញាបនបត្ររបស់គេហទំព័រនោះទេ។
ទុកការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រឱ្យបើក។ ការផ្តល់ socket ដែលបានភ្ជាប់ជៀសវាងការបើកការតភ្ជាប់ផ្ទាល់ដាច់ដោយឡែកទៅគេហទំព័រ ខណៈរក្សាអត្តសញ្ញាណ TLS របស់វា។
timeout របស់ SOCKS កំណត់ការចរចានោះ។ ការផ្លាស់ប្តូរ TLS និងកម្មវិធីបន្ទាប់នៅតែត្រូវការ timeout ការបោះបង់ និងគោលការណ៍សម្អាតដែលអ្នកហៅមានបំណង។