SocksClient.createConnection ആവശ്യപ്പെട്ട destination-ലേക്ക് ബന്ധിപ്പിച്ച stream തിരികെ നൽകുന്നു. HTTPS-ന് ആ stream HTTP അഭ്യർത്ഥന വഹിക്കുന്നതിന് മുമ്പ് ഇപ്പോഴും TLS handshake ആവശ്യമാണ്.

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`
  );
});

SOCKS5 proxy പട്ടിക proxy host-നും port-നും സ്ഥാനാർത്ഥികൾ നൽകുന്നു. onTransportError-ഉം onResponseBytes-ഉം നിലവിലുള്ള ആപ്ലിക്കേഷന്റെതാണ്; രണ്ടാമത്തേത് HTTP response stream പാഴ്സ് ചെയ്യണം. TLS ഡാറ്റാ കഷണങ്ങൾ സ്വതന്ത്രമായി പൂർണ്ണ HTTP സന്ദേശങ്ങളല്ല.

servername destination-ന്റെ DNS നാമമാണ്. Node-ന്റെ താഴ്ന്ന നിലയിലുള്ള tls.connect സ്വതവേ SNI സജീവമാക്കുന്നില്ല, proxy hostname വെബ്സൈറ്റിന്റെ സർട്ടിഫിക്കറ്റ് ഐഡന്റിറ്റിയല്ല.

സർട്ടിഫിക്കറ്റ് പരിശോധന ഓണായി സൂക്ഷിക്കുക. ബന്ധിപ്പിച്ച socket നൽകുന്നത് TLS ഐഡന്റിറ്റി നിലനിർത്തിക്കൊണ്ട് വെബ്സൈറ്റിലേക്ക് പ്രത്യേക നേരിട്ടുള്ള കണക്ഷൻ തുറക്കുന്നത് ഒഴിവാക്കുന്നു.

SOCKS ടൈംഔട്ട് ആ ചർച്ചയെ പരിമിതപ്പെടുത്തുന്നു. തുടർന്നുള്ള TLS-ഉം ആപ്ലിക്കേഷൻ കൈമാറ്റവും ഇപ്പോഴും വിളിക്കുന്നയാളുടെ ഉദ്ദേശിച്ച ടൈംഔട്ട്, റദ്ദാക്കൽ, വൃത്തിയാക്കൽ നയം എന്നിവ ആവശ്യപ്പെടുന്നു.

അനുബന്ധ ലേഖനങ്ങൾ