@@ -17,6 +17,7 @@ var Connection = function(config) {
17
17
this . encoding = 'utf8' ;
18
18
this . parsedStatements = { } ;
19
19
this . writer = new Writer ( ) ;
20
+ this . checkSslResponse = false ;
20
21
} ;
21
22
22
23
util . inherits ( Connection , EventEmitter ) ;
@@ -37,14 +38,42 @@ p.connect = function(port, host) {
37
38
this . stream . on ( 'connect' , function ( ) {
38
39
self . emit ( 'connect' ) ;
39
40
} ) ;
40
-
41
+
42
+ this . on ( 'sslresponse' , function ( msg ) {
43
+ if ( msg . text == 0x53 ) {
44
+ var tls = require ( 'tls' ) ;
45
+ self . stream . removeAllListeners ( ) ;
46
+ self . stream = tls . connect ( { socket : self . stream , servername : host , rejectUnauthorized : true } ) ;
47
+ self . stream . on ( 'data' , function ( buffer ) {
48
+ self . setBuffer ( buffer ) ;
49
+ var msg ;
50
+ while ( msg = self . parseMessage ( ) ) {
51
+ self . emit ( 'message' , msg ) ;
52
+ self . emit ( msg . name , msg ) ;
53
+ }
54
+ } ) ;
55
+ self . stream . on ( 'error' , function ( error ) {
56
+ self . emit ( 'error' , error ) ;
57
+ } ) ;
58
+ self . emit ( 'sslconnect' ) ;
59
+ } else {
60
+ throw new Error ( "The server doesn't support SSL/TLS connections." ) ;
61
+ }
62
+ } ) ;
41
63
42
64
this . stream . on ( 'data' , function ( buffer ) {
43
65
self . setBuffer ( buffer ) ;
44
66
var msg ;
45
- while ( msg = self . parseMessage ( ) ) {
46
- self . emit ( 'message' , msg ) ;
47
- self . emit ( msg . name , msg ) ;
67
+ if ( self . checkSslResponse ) {
68
+ while ( msg = self . readSslResponse ( ) ) {
69
+ self . emit ( 'message' , msg ) ;
70
+ self . emit ( msg . name , msg ) ;
71
+ }
72
+ } else {
73
+ while ( msg = self . parseMessage ( ) ) {
74
+ self . emit ( 'message' , msg ) ;
75
+ self . emit ( msg . name , msg ) ;
76
+ }
48
77
}
49
78
} ) ;
50
79
@@ -53,6 +82,22 @@ p.connect = function(port, host) {
53
82
} ) ;
54
83
} ;
55
84
85
+ p . requestSsl = function ( config ) {
86
+ this . checkSslResponse = true ;
87
+
88
+ var bodyBuffer = this . writer
89
+ . addInt16 ( 0x04D2 )
90
+ . addInt16 ( 0x162F ) . flush ( ) ;
91
+
92
+ var length = bodyBuffer . length + 4 ;
93
+
94
+ var buffer = new Writer ( )
95
+ . addInt32 ( length )
96
+ . add ( bodyBuffer )
97
+ . join ( ) ;
98
+ this . stream . write ( buffer ) ;
99
+ }
100
+
56
101
p . startup = function ( config ) {
57
102
var bodyBuffer = this . writer
58
103
. addInt16 ( 3 )
@@ -225,6 +270,16 @@ p.setBuffer = function(buffer) {
225
270
this . offset = 0 ;
226
271
} ;
227
272
273
+ p . readSslResponse = function ( ) {
274
+ var remaining = this . buffer . length - ( this . offset ) ;
275
+ if ( remaining < 1 ) {
276
+ this . lastBuffer = this . buffer ;
277
+ this . lastOffset = this . offset ;
278
+ return false ;
279
+ }
280
+ return { name : 'sslresponse' , text : this . buffer [ this . offset ++ ] } ;
281
+ } ;
282
+
228
283
p . parseMessage = function ( ) {
229
284
var remaining = this . buffer . length - ( this . offset ) ;
230
285
if ( remaining < 5 ) {
0 commit comments