Skip to content

Commit

Permalink
feat: parse UTF-8 support FeatureExtAck
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremy-w committed Aug 13, 2021
1 parent 3b8d92a commit c91258e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 9 deletions.
14 changes: 10 additions & 4 deletions src/token/feature-ext-ack-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});
});
Expand Down
8 changes: 7 additions & 1 deletion src/token/token.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down
30 changes: 26 additions & 4 deletions test/unit/token/feature-ext-parser-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(''));

Expand All @@ -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);
});
});

0 comments on commit c91258e

Please sign in to comment.