@@ -4,6 +4,10 @@ const common = require('../common');
4
4
if ( ! common . hasCrypto )
5
5
common . skip ( 'missing crypto' ) ;
6
6
7
+ // This test verifies the behavior of the tls setSecureContext() method.
8
+ // It also verifies that existing connections are not disrupted when the
9
+ // secure context is changed.
10
+
7
11
const assert = require ( 'assert' ) ;
8
12
const https = require ( 'https' ) ;
9
13
const fixtures = require ( '../common/fixtures' ) ;
@@ -19,54 +23,63 @@ const credentialOptions = [
19
23
ca : fixtures . readKey ( 'ca2-cert.pem' )
20
24
}
21
25
] ;
22
- let requestsCount = 0 ;
23
26
let firstResponse ;
24
27
25
28
const server = https . createServer ( credentialOptions [ 0 ] , ( req , res ) => {
26
- requestsCount ++ ;
29
+ const id = + req . headers . id ;
27
30
28
- if ( requestsCount === 1 ) {
31
+ if ( id === 1 ) {
29
32
firstResponse = res ;
30
33
firstResponse . write ( 'multi-' ) ;
31
34
return ;
32
- } else if ( requestsCount === 3 ) {
35
+ } else if ( id === 4 ) {
33
36
firstResponse . write ( 'success-' ) ;
34
37
}
35
38
36
39
res . end ( 'success' ) ;
37
40
} ) ;
38
41
39
- server . listen ( 0 , common . mustCall ( async ( ) => {
42
+ server . listen ( 0 , common . mustCall ( ( ) => {
40
43
const { port } = server . address ( ) ;
41
- const firstRequest = makeRequest ( port ) ;
44
+ const firstRequest = makeRequest ( port , 1 ) ;
45
+
46
+ async function makeRemainingRequests ( ) {
47
+ // Wait until the first request is guaranteed to have been handled.
48
+ if ( ! firstResponse ) {
49
+ return setImmediate ( makeRemainingRequests ) ;
50
+ }
42
51
43
- assert . strictEqual ( await makeRequest ( port ) , 'success' ) ;
52
+ assert . strictEqual ( await makeRequest ( port , 2 ) , 'success' ) ;
44
53
45
- server . setSecureContext ( credentialOptions [ 1 ] ) ;
46
- firstResponse . write ( 'request-' ) ;
47
- await assert . rejects ( async ( ) => {
48
- await makeRequest ( port ) ;
49
- } , / ^ E r r o r : s e l f s i g n e d c e r t i f i c a t e $ / ) ;
54
+ server . setSecureContext ( credentialOptions [ 1 ] ) ;
55
+ firstResponse . write ( 'request-' ) ;
56
+ await assert . rejects ( async ( ) => {
57
+ await makeRequest ( port , 3 ) ;
58
+ } , / ^ E r r o r : s e l f s i g n e d c e r t i f i c a t e $ / ) ;
50
59
51
- server . setSecureContext ( credentialOptions [ 0 ] ) ;
52
- assert . strictEqual ( await makeRequest ( port ) , 'success' ) ;
60
+ server . setSecureContext ( credentialOptions [ 0 ] ) ;
61
+ assert . strictEqual ( await makeRequest ( port , 4 ) , 'success' ) ;
53
62
54
- server . setSecureContext ( credentialOptions [ 1 ] ) ;
55
- firstResponse . end ( 'fun!' ) ;
56
- await assert . rejects ( async ( ) => {
57
- await makeRequest ( port ) ;
58
- } , / ^ E r r o r : s e l f s i g n e d c e r t i f i c a t e $ / ) ;
63
+ server . setSecureContext ( credentialOptions [ 1 ] ) ;
64
+ firstResponse . end ( 'fun!' ) ;
65
+ await assert . rejects ( async ( ) => {
66
+ await makeRequest ( port , 5 ) ;
67
+ } , / ^ E r r o r : s e l f s i g n e d c e r t i f i c a t e $ / ) ;
68
+
69
+ assert . strictEqual ( await firstRequest , 'multi-request-success-fun!' ) ;
70
+ server . close ( ) ;
71
+ }
59
72
60
- assert . strictEqual ( await firstRequest , 'multi-request-success-fun!' ) ;
61
- server . close ( ) ;
73
+ makeRemainingRequests ( ) ;
62
74
} ) ) ;
63
75
64
- function makeRequest ( port ) {
76
+ function makeRequest ( port , id ) {
65
77
return new Promise ( ( resolve , reject ) => {
66
78
const options = {
67
79
rejectUnauthorized : true ,
68
80
ca : credentialOptions [ 0 ] . ca ,
69
- servername : 'agent1'
81
+ servername : 'agent1' ,
82
+ headers : { id }
70
83
} ;
71
84
72
85
https . get ( `https://localhost:${ port } ` , options , ( res ) => {
0 commit comments