Noden HTTP-palvelin käsittelee tavallisen välityspalvelinpyynnön pyyntönsä takaisinkutsun kautta. CONNECT kulkee toista reittiä: palvelin lähettää connect-tapahtuman yhdessä pyynnön, asiakkaan socketin ja head-puskurin kanssa.

Tämä tapahtuma on luovutus HTTP-jäsennyksen ja tunnelin välillä. Tavallista ServerResponse-oliota ei ole, jota voisi jatkaa tunneloidun liikenteen käytössä.

ArgumenttiMitä se kuljettaa
reqCONNECT-pyyntö, mukaan lukien sen kohdevaltuus ja otsakkeet
clientSocketYhteys takaisin asiakkaaseen
headTunnelitiedot, jotka Node on jo lukenut HTTP-otsakkeiden jälkeen, mahdollisesti tyhjät

Viimeistele HTTP-päätös ennen tavujen välittämistä

Validoi pyydetty isäntä ja portti, sovella välityspalvelimen käyttö- ja todennuspolitiikkaa ja muodosta ylävirran yhteys. CONNECT tunnistaa valtuuden kuten service.example:443; jäsennä tämä muoto IPv6-valtuudet huomioiden sen sijaan, että jakaisit sokeasti jokaisesta kaksoispisteestä.

Kun tunneli hyväksytään, lähetä onnistunut HTTP-vastaus ja sen päättävä tyhjä rivi. Välitä sitten mahdolliset head-tavut ylävirtaan ennen kuin jatkat asiakkaan socketista tulevilla myöhemmillä tavuilla. Uuden datakuuntelijan liittäminen ei voi palauttaa puskuria, joka on jo toimitettu käsittelijälle erikseen.

Noden virallinen tunnelointiesimerkki suorittaa tämän luovutuksen serverSocket.write(head)-kutsulla ennen kahden virran suunnan yhdistämistä. Sen pieni esimerkki havainnollistaa siirtymää; käyttöön otettu välityspalvelin tarvitsee myös rajattuja yhteysyrityksiä, käytönvalvontaa ja elinkaaren hallintaa.

Onnistumisen jälkeen tavut kuuluvat palvelun protokollalle

Onnistunut CONNECT-vastaus muuttaa yhteyden tavuvirraksi. Jos kohde on HTTPS-sivusto, sen TLS-vaihto kulkee tämän virran sisällä. Pelkkä tunnelointi ei edellytä, että välityspalvelin myöntää korvaavan verkkosivuston varmenteen.

Ennen CONNECTin hyväksymistä HTTP-virhe voi selittää, miksi se hylättiin. Hyväksymisen jälkeen HTTP 500 -vastauksen kirjoittaminen virtaan lisäisi tavuja tunnelin protokollaan. Sen sijaan lopeta tai tuhoa asianmukaiset yhteydet myöhemmissä virheissä.

Yhdistä molemmat suunnat vastapaineen huomioiva virrankäsittely-kohdalla ja päätä, miten end-, error- ja close-tapahtumat lopettavat vastapuolen. Säilytä alkuperäinen head-puskuri osana samaa omistajuusmallia; se on sovelluksen dataa, ei ylimääräisiä HTTP-otsakkeita hävitettäväksi.

Aiheeseen liittyvät artikkelit