SocksClient.createConnection mengembalikan aliran yang disambungkan ke destinasi yang diminta. Untuk HTTPS, aliran itu masih memerlukan jabat tangan TLS sebelum membawa permintaan 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`
  );
});

Senarai proksi SOCKS5 menyediakan calon untuk hos dan port proksi. onTransportError dan onResponseBytes milik aplikasi sedia ada; yang kedua perlu menghuraikan aliran respons HTTP. Cebisan data TLS bukan mesej HTTP yang lengkap secara berasingan.

servername ialah nama DNS destinasi. tls.connect peringkat rendah Node tidak mengaktifkan SNI secara lalai, dan nama hos proksi bukan identiti sijil laman web.

Kekalkan pengesahan sijil dihidupkan. Memberikan soket yang disambungkan mengelakkan pembukaan sambungan langsung berasingan ke laman web sambil mengekalkan identiti TLS-nya.

Tamat masa SOCKS mengehadkan rundingan itu. Pertukaran TLS dan aplikasi selepas itu masih memerlukan tamat masa, pembatalan dan dasar pembersihan yang dimaksudkan oleh pemanggil.

Artikel berkaitan