@@ -76,6 +76,28 @@ describe("Read-TLS-Client-Hello", () => {
7676 expect ( curveFormats ) . to . deep . equal ( [ 0 , 1 , 2 ] ) ;
7777 } ) ;
7878
79+ it ( "can read Node's client hello data" , async ( ) => {
80+ server = makeDestroyable ( new net . Server ( ) ) ;
81+
82+ server . listen ( ) ;
83+ await new Promise ( ( resolve ) => server . on ( 'listening' , resolve ) ) ;
84+
85+ let incomingSocketPromise = getDeferred < net . Socket > ( ) ;
86+ server . on ( 'connection' , ( socket ) => incomingSocketPromise . resolve ( socket ) ) ;
87+
88+ const port = ( server . address ( ) as net . AddressInfo ) . port ;
89+ tls . connect ( {
90+ host : 'localhost' ,
91+ port
92+ } ) . on ( 'error' , ( ) => { } ) ; // Socket will fail, since server never responds, that's OK
93+
94+ const incomingSocket = await incomingSocketPromise ;
95+ const { serverName, alpnProtocols } = await readTlsClientHello ( incomingSocket ) ;
96+
97+ expect ( serverName ) . to . equal ( undefined ) ; // No SNI set for pure TLS like this
98+ expect ( alpnProtocols ) . to . equal ( undefined ) ; // No SNI set for pure TLS like this
99+ } ) ;
100+
79101 it ( "can read Node's JA3 fingerprint" , async ( ) => {
80102 server = makeDestroyable ( new net . Server ( ) ) ;
81103
@@ -144,6 +166,16 @@ describe("Read-TLS-Client-Hello", () => {
144166 expect ( serverName ) . to . equal ( 'localhost' ) ;
145167 } ) ;
146168
169+ it ( "can capture ALPN protocols from a Chrome request" , async ( ) => {
170+ const incomingData = fs . createReadStream ( path . join ( __dirname , 'fixtures' , 'chrome-tls-connect.bin' ) ) ;
171+
172+ const { alpnProtocols } = await readTlsClientHello ( incomingData ) ;
173+ expect ( alpnProtocols ) . to . deep . equal ( [
174+ 'h2' ,
175+ 'http/1.1'
176+ ] ) ;
177+ } ) ;
178+
147179 it ( "can calculate the correct TLS fingerprint from a Chrome request" , async ( ) => {
148180 const incomingData = fs . createReadStream ( path . join ( __dirname , 'fixtures' , 'chrome-tls-connect.bin' ) ) ;
149181
0 commit comments