From c91258e8b634955e5b9f50c52229e44b715c6e03 Mon Sep 17 00:00:00 2001 From: "Jeremy W. Sherman" Date: Sun, 1 Aug 2021 21:10:11 -0400 Subject: [PATCH] feat: parse UTF-8 support FeatureExtAck [#1143] --- src/token/feature-ext-ack-parser.ts | 14 +++++++--- src/token/token.ts | 8 +++++- test/unit/token/feature-ext-parser-test.js | 30 +++++++++++++++++++--- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/token/feature-ext-ack-parser.ts b/src/token/feature-ext-ack-parser.ts index 62c727925..20971bb72 100644 --- a/src/token/feature-ext-ack-parser.ts +++ b/src/token/feature-ext-ack-parser.ts @@ -9,24 +9,30 @@ const FEATURE_ID = { COLUMNENCRYPTION: 0x04, GLOBALTRANSACTIONS: 0x05, AZURESQLSUPPORT: 0x08, + UTF8_SUPPORT: 0x0A, TERMINATOR: 0xFF }; function featureExtAckParser(parser: Parser, _options: InternalConnectionOptions, callback: (token: FeatureExtAckToken) => void) { let fedAuth: Buffer | undefined; + let utf8Support: boolean | undefined; function next() { parser.readUInt8((featureId) => { if (featureId === FEATURE_ID.TERMINATOR) { - return callback(new FeatureExtAckToken(fedAuth)); + return callback(new FeatureExtAckToken(fedAuth, utf8Support)); } parser.readUInt32LE((featureAckDataLen) => { parser.readBuffer(featureAckDataLen, (featureData) => { - if (featureId === FEATURE_ID.FEDAUTH) { - fedAuth = featureData; + switch (featureId) { + case FEATURE_ID.FEDAUTH: + fedAuth = featureData; + break; + case FEATURE_ID.UTF8_SUPPORT: + utf8Support = !!featureData[0]; + break; } - next(); }); }); diff --git a/src/token/token.ts b/src/token/token.ts index c785305d8..c5945adf5 100644 --- a/src/token/token.ts +++ b/src/token/token.ts @@ -316,10 +316,16 @@ export class FeatureExtAckToken extends Token { fedAuth: Buffer | undefined; - constructor(fedAuth: Buffer | undefined) { + /** Value of UTF8_SUPPORT acknowledgement. + * + * undefined when UTF8_SUPPORT not included in token. */ + utf8Support: boolean | undefined; + + constructor(fedAuth: Buffer | undefined, utf8Support: boolean | undefined) { super('FEATUREEXTACK', 'featureExtAck'); this.fedAuth = fedAuth; + this.utf8Support = utf8Support; } } diff --git a/test/unit/token/feature-ext-parser-test.js b/test/unit/token/feature-ext-parser-test.js index 8ceff171f..d76b1d637 100644 --- a/test/unit/token/feature-ext-parser-test.js +++ b/test/unit/token/feature-ext-parser-test.js @@ -2,21 +2,21 @@ const StreamParser = require('../../../src/token/stream-parser'); const WritableTrackingBuffer = require('../../../src/tracking-buffer/writable-tracking-buffer'); const assert = require('chai').assert; -describe('Feature Ext Praser', () => { +describe('Feature Ext Parser', () => { it('should be fed authentication', async () => { const buffer = new WritableTrackingBuffer(50, 'ucs2'); buffer.writeUInt8(0xAE); // FEATUREEXTACK token header - buffer.writeUInt8(0x01); + buffer.writeUInt8(0x01); // SESSIONRECOVERY buffer.writeUInt32LE(1); buffer.writeBuffer(Buffer.from('a')); - buffer.writeUInt8(0x02); + buffer.writeUInt8(0x02); // FEDAUTH buffer.writeUInt32LE(2); buffer.writeBuffer(Buffer.from('bc')); - buffer.writeUInt8(0x03); + buffer.writeUInt8(0x03); // made-up feature ext buffer.writeUInt32LE(0); buffer.writeBuffer(Buffer.from('')); @@ -27,6 +27,28 @@ describe('Feature Ext Praser', () => { assert.isFalse(result.done); const token = result.value; assert.isOk(token.fedAuth.equals(Buffer.from('bc'))); + assert.isUndefined(token.utf8Support); // feature ext ack for UTF8_SUPPORT was not received + assert.isTrue((await parser.next()).done); + }); + + it('should parse UTF-8 support token', async () => { + const buffer = new WritableTrackingBuffer(8); + + buffer.writeUInt8(0xAE); // FEATUREEXTACK token header + buffer.writeUInt8(0x0A); // UTF8_SUPPORT feature id + buffer.writeUInt32LE(0x00_00_00_01); // datalen + buffer.writeUInt8(0x01); // supported + + buffer.writeUInt8(0xFF); // TERMINATOR + + const parser = StreamParser.parseTokens([buffer.data], {}, {}); + const result = await parser.next(); + assert.isFalse(result.done); + + const token = result.value; + assert.strictEqual(token.utf8Support, true); // feature ext ack for UTF8_SUPPORT was positive + assert.isUndefined(token.fedAuth); // fed auth not ack'd + assert.isTrue((await parser.next()).done); }); });