Սպասեք CONNECT-ից հետո դատարկ տողին
Կարդացեք ամբողջական HTTP/1 CONNECT պատասխանը նախքան socket-ը TLS-ին հանձնելը, նույնիսկ եթե կարգավիճակի տողը առաջինն է գալիս։
Հաճախորդը տեսնում է 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-ն չի պահպանում սերվերի գրելու սահմանները։
Հանձնումը դարձրեք parser-ի բացահայտ վիճակ
- Հավաքեք և վերլուծեք կարգավիճակի տողը։ Օգտագործեք թվային կարգավիճակը, ոչ թե ճշգրիտ անգլերեն պատճառաբանություն։
- Շարունակեք մինչև վերնագրի բաժնի ամբողջական ավարտիչը գա։ Հաջող կարգավիճակի տողը չի վերացնում մնացած դաշտերը։
- Հաջող CONNECT պատասխանի դեպքում այդ ավարտիչից անմիջապես հետո եկող բայթը համարեք թունելի տվյալների սկիզբ։ Այլ պատասխանների դեպքում հետևեք համապատասխան HTTP պատասխանի և նույնականացման մշակմանը։
- Փոխանցեք կապը և չօգտագործված բայթերը հաջորդ արձանագրության աջակցած բուֆերացված I/O ինտերֆեյսով։
Վերջին քայլը կարևոր է նույնիսկ լավ բաժանիչի որոնման դեպքում։ Բուֆերացված ընթերցիչը կարող է ավելի շատ socket սպառած լինել, քան parser-ը պահանջել էր։ TLS-ը մերկ socket-ի վրա սկսելը՝ այդ ընթերցիչը լքելով, կարող է բայթեր թողնել ընթերցիչի մասնավոր բուֆերում։
Օգտագործեք կարգավորման վերջնաժամկետ և վերնագրի չափի սահման։ Ավարտիչից առաջ EOF-ը թերի proxy պատասխան է, ոչ թե հրավեր անվերջ սպասելու կամ այնուամենայնիվ TLS փորձելու։
Մտածեք մի քանի սահմանների մասին
Պատկերացրեք ընթերցում, որն ավարտվում է Proxy-Agent:-ից հետո։ Parser-ին դեռ պետք են լրացուցիչ HTTP վերնագրի բայթեր։ Պատկերացրեք մեկ այլը, որն ավարտվում է վերջին CRLF հաջորդականության կեսին։ Դա դեռ ամբողջական վերնագրի բաժին չէ։ Հիմա պատկերացրեք ամբողջական հաջող վերնագրի բաժին, որին նույն բուֆերում հետևում են թունելի բայթեր․ այդ լրացուցիչ բայթերը պետք է վերապրեն հանձնումը։
407-ը այլ ելք է։ Այն պահանջում է նույնականացման մշակում․ այն թույլ չի տալիս TLS ClientHello ուղարկել երբեք չբացված թունել։
Նախընտրեք պահպանվող connector, եթե ձեռքսեղմման իրականացումը հենց խնդիրը չէ։ Այս սահմանը վերաբերում է այստեղ ցուցադրված HTTP/1 փոխանակմանը։ HTTP/2 proxy-ն CONNECT-ը կրում է այլ շրջանակավորմամբ հոսքում։