CONNECT-тен кейінгі бос жолды күтіңіз
Күй жолы бірінші келсе де, сокетті TLS-ке бермес бұрын толық HTTP/1 CONNECT жауабын оқыңыз.
Клиент 200 Connection Established көріп, TLS-ті бастайды және TLS жазбасы болуы керек жерде бірден мағынасыздық хабарлайды. Межелі жердің шифр параметрлерін кінәламас бұрын аяқталмаған HTTP жауабын іздеңіз.
HTTP/1 CONNECT алмасуында күй жолы — жауаптың тек басы. Одан кейін тақырып өрістері келуі мүмкін. Сәтті CONNECT жауабынан кейін тақырып бөлігін аяқтайтын бос жол туннельге ауысуды білдіреді.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Бұл байттар бір оқуда, бірнеше оқуда немесе келесі байттарды да қамтитын оқуда келуі мүмкін. TCP сервердің жазу шекараларын сақтамайды.
Беруді парсердің айқын күйіне айналдырыңыз
- Күй жолын жинап, талдаңыз. Нақты ағылшын себеп тіркесінің орнына сандық күйді қолданыңыз.
- Тақырып бөлігінің толық аяқтаушысы келгенше жалғастырыңыз. Сәтті күй жолы қалған өрістерді жоймайды.
- Сәтті CONNECT жауабында сол аяқтаушыдан кейінгі байтты туннель деректерінің басы деп есептеңіз. Басқа жауаптарда тиісті HTTP жауабы мен аутентификация өңдеуін ұстаныңыз.
- Қосылымды және пайдаланылмаған байттарды келесі протокол қолдайтын буферлік I/O интерфейсі арқылы беріңіз.
Соңғы қадам жақсы бөлгіш іздеуінде де маңызды. Буферлік оқырман парсер сұрағаннан көбірек сокетті тұтынған болуы мүмкін. Сол оқырманды тастап, жалаң сокетте TLS бастау байттарды оқырманның жеке буферінде қалдыруы мүмкін.
Орнату үшін мерзім және тақырып өлшемінің шегі қолданыңыз. Аяқтаушыға дейінгі EOF — толық емес прокси жауабы, мәңгі күтуге немесе бәрібір TLS көруге шақыру емес.
Бірнеше шекараны ойлап көріңіз
Proxy-Agent:-ден кейін аяқталатын оқуды елестетіңіз. Парсерге әлі де HTTP тақырып байттары қажет. Соңғы CRLF тізбегінің ортасында аяқталатын басқа оқуды елестетіңіз. Бұл әлі толық тақырып бөлігі емес. Енді сол буферде толық сәтті тақырып бөлігінен кейін туннель байттары келетінін елестетіңіз: бұл қосымша байттар беруден аман өтуі керек.
407 — басқа нәтиже. Ол аутентификация өңдеуін талап етеді; ол ешқашан ашылмаған туннельге TLS ClientHello жіберуге рұқсат бермейді.
Қолмен амандасуды іске асырудың өзі тапсырма болмаса, қолдау көрсетілетін коннекторды таңдаңыз. Бұл шекара осында көрсетілген HTTP/1 алмасуына тән. HTTP/2 проксиі CONNECT-ті өзгеше фреймдеуі бар ағында тасымалдайды.