|
1 | 1 | const { assert } = require('chai'); |
2 | 2 | const net = require('net'); |
3 | 3 |
|
4 | | -const { Connection } = require('../../src/tedious'); |
| 4 | +const { Connection, ConnectionError } = require('../../src/tedious'); |
5 | 5 | const IncomingMessageStream = require('../../src/incoming-message-stream'); |
6 | 6 | const OutgoingMessageStream = require('../../src/outgoing-message-stream'); |
7 | 7 | const Debug = require('../../src/debug'); |
@@ -381,4 +381,85 @@ describe('Connecting to a server that sends a re-routing information', function( |
381 | 381 | connection.close(); |
382 | 382 | } |
383 | 383 | }); |
| 384 | + |
| 385 | + it('it should throw an error with redirect information when targetserver connection failed', async function() { |
| 386 | + routingServer.on('connection', async (connection) => { |
| 387 | + const debug = new Debug(); |
| 388 | + const incomingMessageStream = new IncomingMessageStream(debug); |
| 389 | + const outgoingMessageStream = new OutgoingMessageStream(debug, { packetSize: 4 * 1024 }); |
| 390 | + |
| 391 | + connection.pipe(incomingMessageStream); |
| 392 | + outgoingMessageStream.pipe(connection); |
| 393 | + |
| 394 | + try { |
| 395 | + const messageIterator = incomingMessageStream[Symbol.asyncIterator](); |
| 396 | + |
| 397 | + // PRELOGIN |
| 398 | + { |
| 399 | + const { value: message } = await messageIterator.next(); |
| 400 | + assert.strictEqual(message.type, 0x12); |
| 401 | + |
| 402 | + const chunks = []; |
| 403 | + for await (const data of message) { |
| 404 | + chunks.push(data); |
| 405 | + } |
| 406 | + |
| 407 | + const responsePayload = new PreloginPayload({ encrypt: false, version: { major: 0, minor: 0, build: 0, subbuild: 0 } }); |
| 408 | + const responseMessage = new Message({ type: 0x12 }); |
| 409 | + responseMessage.end(responsePayload.data); |
| 410 | + outgoingMessageStream.write(responseMessage); |
| 411 | + } |
| 412 | + |
| 413 | + // LOGIN7 |
| 414 | + { |
| 415 | + const { value: message } = await messageIterator.next(); |
| 416 | + assert.strictEqual(message.type, 0x10); |
| 417 | + |
| 418 | + const chunks = []; |
| 419 | + for await (const data of message) { |
| 420 | + chunks.push(data); |
| 421 | + } |
| 422 | + |
| 423 | + const responseMessage = new Message({ type: 0x04 }); |
| 424 | + responseMessage.write(buildLoginAckToken()); |
| 425 | + responseMessage.end(buildRoutingEnvChangeToken('test.invalid', targetServer.address().port)); |
| 426 | + outgoingMessageStream.write(responseMessage); |
| 427 | + } |
| 428 | + |
| 429 | + // No further messages, connection closed on remote |
| 430 | + { |
| 431 | + const { done } = await messageIterator.next(); |
| 432 | + assert.isTrue(done); |
| 433 | + } |
| 434 | + } catch (err) { |
| 435 | + process.nextTick(() => { |
| 436 | + throw err; |
| 437 | + }); |
| 438 | + } finally { |
| 439 | + connection.end(); |
| 440 | + } |
| 441 | + }); |
| 442 | + |
| 443 | + const connection = new Connection({ |
| 444 | + server: routingServer.address().address, |
| 445 | + options: { |
| 446 | + port: routingServer.address().port, |
| 447 | + encrypt: false |
| 448 | + } |
| 449 | + }); |
| 450 | + |
| 451 | + try { |
| 452 | + await new Promise((resolve, reject) => { |
| 453 | + connection.connect((err) => { |
| 454 | + err ? reject(err) : resolve(err); |
| 455 | + }); |
| 456 | + }); |
| 457 | + } catch (err) { |
| 458 | + assert.instanceOf(err, ConnectionError); |
| 459 | + const message = `Failed to connect to test.invalid:${targetServer.address().port} (redirected from ${routingServer.address().address}:${routingServer.address().port})`; |
| 460 | + assert.include(err.message, message); |
| 461 | + } finally { |
| 462 | + connection.close(); |
| 463 | + } |
| 464 | + }); |
384 | 465 | }); |
0 commit comments