Pieni proxy-kääre voi toimia HTTPS:n kanssa ja jäädä sitten jumiin, kun sitä käytetään uudelleen protokollalle, jonka palvelin puhuu ensin. Epäilyttävä rivi on usein se, joka odottaa vastaanottopuskurin päättyvän merkkijonoon \r\n\r\n.

TCP antaa asiakkaalle virran. Yksi vastaanottokutsu voi palauttaa puolikkaan HTTP-tilarivistä, täydellisen CONNECT-vastauksen tai sen vastauksen heti seuraavan tunnelidatan. Ei ole takeita siitä, että lukeminen pysähtyy otsakkeiden loppuun.

Etsi raja puskurin sisältä

HTTP/1.1 CONNECT -vaihdossa kerää tavuja, kunnes otsakkeiden päätemerkki ilmestyy mihin tahansa puskurin kohtaan. Jaa sen ensimmäisen esiintymän kohdalta. Jäsennä tilarivi ja otsakkeet ensimmäisestä osasta; säilytä kaikki rajan jälkeinen erikseen. Aseta otsakkeiden kokoraja ja aikakatkaisu odottaessa, ja kohtele tyhjää socket-lukua suljettuna yhteytenä, älä uutena kutsuna silmukoida.

Lopullinen onnistunut 2xx-vastaus vaihtaa yhteyden tunnelitilaan välittömästi noiden otsakkeiden jälkeen. Sen perässä tulevat tavut ovat jo tunnelitavuja. Älä hylkää niitä, älä odota CONNECT-vastauksen runkoa äläkä tulkitse Content-Length-kenttää luvaksi kuluttaa osa uudesta protokollasta. Informatiiviset vastaukset, jos niitä on, on käsiteltävä ennen tuota lopullista vastausta.

Kääreen on välitettävä tähteensä eteenpäin

Vain taustalla olevan socketin palauttaminen kadottaa kaikki tavut, jotka kättelyn jäsennin on jo vetänyt siitä. Seuraava lukija tarvitsee puskuroidun virran, joka antaa tallennetun hännän ensin ja jatkaa sitten socket-lukuja. Palvelin ensin -protokollalle alkutervehdyksen menettäminen voi jättää molemmat osapuolet odottamaan loputtomiin.

Toisaalta epäonnistuneen CONNECT-vastauksen tavut eivät ole tunnelin tervehdys. 407 kuuluu yhä proxy-vaihtoon ja vaatii todennuksen käsittelyn; toinen epäonnistunut tila vaatii asianmukaisen virhepolun.

Tämä on erityisen tärkeää sovitettaessa FTP- tai SSH-asiakasta HTTP-proxyn kautta. Proxyn on myös sallittava pyydetty kohdeportti, ja FTP voi tarvita lisää datayhteyksiä. Oikea otsakkeiden jäsennys ratkaisee virran siirron; se ei voi myöntää CONNECT-oikeutta tai tarjota FTP:n toista kanavaa.

Aiheeseen liittyvät artikkelit