@ -47,10 +47,14 @@ var serverOptions = {
// Just to test asynchronous callback
setTimeout ( function ( ) {
if ( credentials )
callback ( null , crypto . createCredentials ( credentials ) . context ) ;
else
if ( credentials ) {
if ( credentials . emptyRegression )
callback ( null , { } ) ;
else
callback ( null , crypto . createCredentials ( credentials ) . context ) ;
} else {
callback ( null , null ) ;
}
} , 100 ) ;
}
} ;
@ -63,6 +67,9 @@ var SNIContexts = {
'b.example.com' : {
key : loadPEM ( 'agent3-key' ) ,
cert : loadPEM ( 'agent3-cert' )
} ,
'c.another.com' : {
emptyRegression : true
}
} ;
@ -89,39 +96,73 @@ var clientsOptions = [{
ca : [ loadPEM ( 'ca1-cert' ) ] ,
servername : 'c.wrong.com' ,
rejectUnauthorized : false
} , {
port : serverPort ,
key : loadPEM ( 'agent3-key' ) ,
cert : loadPEM ( 'agent3-cert' ) ,
ca : [ loadPEM ( 'ca1-cert' ) ] ,
servername : 'c.another.com' ,
rejectUnauthorized : false
} ] ;
var serverResults = [ ] ,
clientResults = [ ] ;
clientResults = [ ] ,
serverErrors = [ ] ,
clientErrors = [ ] ,
serverError ,
clientError ;
var server = tls . createServer ( serverOptions , function ( c ) {
serverResults . push ( c . servername ) ;
} ) ;
server . on ( 'clientError' , function ( err ) {
serverResults . push ( null ) ;
serverError = err . message ;
} ) ;
server . listen ( serverPort , startTest ) ;
function startTest ( ) {
function connectClient ( options , callback ) {
function connectClient ( i , callback ) {
var options = clientsOptions [ i ] ;
clientError = null ;
serverError = null ;
var client = tls . connect ( options , function ( ) {
clientResults . push (
/Hostname\/IP doesn't/ . test ( client . authorizationError || '' ) ) ;
client . destroy ( ) ;
callback ( ) ;
next ( ) ;
} ) ;
} ;
connectClient ( clientsOptions [ 0 ] , function ( ) {
connectClient ( clientsOptions [ 1 ] , function ( ) {
connectClient ( clientsOptions [ 2 ] , function ( ) {
server . close ( ) ;
} ) ;
client . on ( 'error' , function ( err ) {
clientResults . push ( false ) ;
clientError = err . message ;
next ( ) ;
} ) ;
function next ( ) {
clientErrors . push ( clientError ) ;
serverErrors . push ( serverError ) ;
if ( i === clientsOptions . length - 1 )
callback ( ) ;
else
connectClient ( i + 1 , callback ) ;
}
} ;
connectClient ( 0 , function ( ) {
server . close ( ) ;
} ) ;
}
process . on ( 'exit' , function ( ) {
assert . deepEqual ( serverResults , [ 'a.example.com' , 'b.example.com' ,
'c.wrong.com' ] ) ;
assert . deepEqual ( clientResults , [ true , true , false ] ) ;
'c.wrong.com' , null ] ) ;
assert . deepEqual ( clientResults , [ true , true , false , false ] ) ;
assert . deepEqual ( clientErrors , [ null , null , null , "socket hang up" ] ) ;
assert . deepEqual ( serverErrors , [ null , null , null , "Invalid SNI context" ] ) ;
} ) ;