1
1
var _request = require ( 'request' ) ,
2
+ dns = require ( 'node:dns' ) ,
2
3
serviceSettings = require ( '../config/config' ) . serviceSettings ,
3
4
responseSettings = require ( '../config/config' ) . responseSettings ,
4
5
utils = require ( './utils' ) ;
@@ -157,9 +158,6 @@ function GatewayService(options) {
157
158
if ( request . hasOwnProperty ( 'portNo' ) && request . portNo !== null ) {
158
159
urlPortNo = request . portNo ;
159
160
}
160
- if ( request . hasOwnProperty ( 'portNo' ) && request . portNo !== null ) {
161
- urlPortNo = request . portNo ;
162
- }
163
161
if ( request . hasOwnProperty ( 'gatewayConnectTimeout' ) && request . gatewayConnectTimeout !== null ) {
164
162
connectTimeout = request . gatewayConnectTimeout ;
165
163
}
@@ -173,36 +171,37 @@ function GatewayService(options) {
173
171
utils . toXML ( request , function ( err , requestXML ) {
174
172
options = {
175
173
method : "POST" ,
176
- uri : urlProtocol + "://" + serverName + urlServlet ,
174
+ uri : urlProtocol + "://" + serverName + ":" + urlPortNo + "/" + urlServlet ,
177
175
body : requestXML ,
178
176
headers : {
179
177
'Content-Type' : 'text/xml' ,
180
- 'User-Agent' : serviceSettings . ROCKETGATE_USER_AGENT
178
+ 'User-Agent' : serviceSettings . ROCKETGATE_USER_AGENT + " " + serviceSettings . VERSION_NUMBER
181
179
} ,
182
180
timeout : connectTimeout * 1000
183
181
} ;
184
182
185
183
_request ( options , function ( err , res , body ) {
186
- var responseCode = null ;
184
+ var responseCode = null , errorMessage ;
187
185
188
186
if ( err ) {
189
- console . log ( 'error: ' , err ) ;
190
- console . log ( options ) ;
187
+ errorMessage = err ;
188
+ } else if ( res . statusCode < 200 || res . statusCode > 299 ) {
189
+ errorMessage = res . statusCode + " " + res . statusMessage ;
191
190
} else {
192
- utils . fromXML ( body , function ( err , json ) {
191
+ utils . fromXML ( body , function ( err , json ) {
193
192
if ( ! err && ! ! json ) {
194
193
response = json ;
195
194
responseCode = json [ responseSettings . RESPONSE_CODE ] ;
196
195
} else {
197
- console . log ( 'Impossible to parse body: ' , err , { options , body } ) ;
196
+ errorMessage = "Can't parse response body as XML" ;
198
197
}
199
198
} ) ;
200
199
}
201
200
if ( responseCode === null ) {
202
- responseCode = "4 " ;
203
- response [ responseSettings . EXCEPTION ] = body ;
201
+ responseCode = "3 " ;
202
+ response [ responseSettings . EXCEPTION ] = errorMessage ;
204
203
response [ responseSettings . RESPONSE_CODE ] = responseCode ;
205
- response [ responseSettings . REASON_CODE ] = "400" ;
204
+ response [ responseSettings . REASON_CODE ] = "304" ; // REASON_RESPONSE_READ_ERROR
206
205
}
207
206
callback ( responseCode , request , response ) ;
208
207
} ) ;
@@ -217,17 +216,14 @@ function GatewayService(options) {
217
216
* @param {Function } callback [description]
218
217
*/
219
218
function performTransaction ( request , response , callback ) {
220
- var index = null ,
221
- swapper = null ,
222
- serverName = gatewaySettings . rocketGateHost ;
219
+ var serverName = null ;
223
220
224
221
var url = require ( 'url' ) ;
225
222
var fullUrl = request . gatewayURL ;
226
223
var embeddedFieldsToken = request . embeddedFieldsToken ;
227
224
228
225
fullUrl = fullUrl || embeddedFieldsToken ;
229
226
if ( fullUrl ) {
230
-
231
227
var parsedUrl = url . parse ( fullUrl , true ) ;
232
228
if ( ! request . gatewayServer ) {
233
229
request . gatewayServer = parsedUrl . host ;
@@ -256,49 +252,75 @@ function GatewayService(options) {
256
252
delete request . failedGUID ;
257
253
}
258
254
259
- // if (serverName.length > 1) {
260
- // index = Math.floor(Math.random() * (serverName.length + 1));
261
- //
262
- // if (index > 0) {
263
- // swapper = serverName[0];
264
- // serverName[0] = serverName[index];
265
- // serverName[index] = swapper;
266
- // }
267
- // }
268
-
269
- index = 0 ;
270
- sendTransaction ( serverName [ index ] , request , response , function ( responseCode , request , response ) {
271
- if ( responseCode == "0" ) {
272
- // transaction succeeded
273
- return callback ( true , request , response ) ;
274
- } else if ( responseCode != "3" ) {
275
- // transaction failed
276
- return callback ( false , request , response ) ;
277
- } else {
278
- // try again
279
- request . failedServer = serverName [ index ] ;
280
- request . failedResponseCode = response [ responseSettings . RESPONSE_CODE ] ;
281
- request . failedReasonCode = response [ responseSettings . REASON_CODE ] ;
282
- request . failedGUID = response [ responseSettings . TRANSACT_ID ] ;
283
-
284
- // if this is the last one to try, send it back
285
- if ( index == serverName . length - 1 ) {
255
+ function _perform ( serverNames ) {
256
+ var index = 0 ;
257
+ sendTransaction ( serverNames [ index ] , request , response , function ( responseCode , request , response ) {
258
+ if ( responseCode == "0" ) {
259
+ // transaction succeeded
260
+ return callback ( true , request , response ) ;
261
+ } else if ( responseCode != "3" ) {
262
+ // transaction failed
286
263
return callback ( false , request , response ) ;
287
264
} else {
288
- //otherwise, give it one more try
289
- index ++ ;
290
- sendTransaction ( serverName [ index ] , request , response , function ( responseCode , request , response ) {
291
- if ( responseCode == "0" ) {
292
- // transaction succeeded
293
- return callback ( true , request , response ) ;
294
- } else {
295
- // transaction failed
296
- return callback ( false , request , response ) ;
265
+ // try again
266
+ request . failedServer = serverNames [ index ] ;
267
+ request . failedResponseCode = response [ responseSettings . RESPONSE_CODE ] ;
268
+ request . failedReasonCode = response [ responseSettings . REASON_CODE ] ;
269
+ request . failedGUID = response [ responseSettings . TRANSACT_ID ] ;
270
+
271
+ // if this is the last one to try, send it back
272
+ if ( index == serverNames . length - 1 ) {
273
+ return callback ( false , request , response ) ;
274
+ } else {
275
+ //otherwise, give it one more try
276
+ index ++ ;
277
+ sendTransaction ( serverNames [ index ] , request , response , function ( responseCode , request , response ) {
278
+ if ( responseCode == "0" ) {
279
+ // transaction succeeded
280
+ return callback ( true , request , response ) ;
281
+ } else {
282
+ // transaction failed
283
+ return callback ( false , request , response ) ;
284
+ }
285
+ } ) ;
286
+ }
287
+ }
288
+ } ) ;
289
+ }
290
+
291
+ if ( serverName != null ) {
292
+ // if is set explicitly via request
293
+ _perform ( serverName )
294
+ } else if ( gatewaySettings . rocketGateDNS !== serviceSettings . LIVE_HOST ) {
295
+ _perform ( gatewaySettings . rocketGateHost ) ;
296
+ } else {
297
+ dns . resolve4 ( serviceSettings . LIVE_HOST , ( err , records ) => {
298
+ if ( err != null || ! records || records . length === 0 ) {
299
+ // DNS resolution failed, use default
300
+ _perform ( gatewaySettings . rocketGateHost )
301
+ } else {
302
+ var liveServerNames = [ ] ;
303
+ for ( var i = 0 ; i < records . length ; i ++ ) {
304
+ var record = records [ i ] ;
305
+ if ( '69.20.127.91' === record ) {
306
+ liveServerNames . push ( serviceSettings . LIVE_HOST_16 ) ;
307
+ } else if ( '72.32.126.131' === record ) {
308
+ liveServerNames . push ( serviceSettings . LIVE_HOST_17 ) ;
297
309
}
298
- } ) ;
310
+ }
311
+ if ( liveServerNames . length === 0 ) {
312
+ // DNS resolution failed, use default
313
+ _perform ( gatewaySettings . rocketGateHost )
314
+ } else {
315
+ if ( liveServerNames . length > 1 ) {
316
+ // distribute load by randomization
317
+ utils . shuffleArray ( liveServerNames )
318
+ }
319
+ _perform ( liveServerNames ) ;
320
+ }
299
321
}
300
- }
301
- } ) ;
322
+ } ) ;
323
+ }
302
324
}
303
325
304
326
/**
0 commit comments