Skip to content

Commit

Permalink
Merge pull request #1407 from blackflux/dev
Browse files Browse the repository at this point in the history
[Gally]: master <- dev
  • Loading branch information
simlu committed Nov 28, 2023
2 parents 15374e1 + 5870b6e commit 8790d13
Show file tree
Hide file tree
Showing 6 changed files with 679 additions and 654 deletions.
9 changes: 4 additions & 5 deletions package.json
Expand Up @@ -41,7 +41,7 @@
},
"homepage": "https://github.com/blackflux/node-tdd#readme",
"devDependencies": {
"@aws-sdk/client-sqs": "3.385.0",
"@aws-sdk/client-sqs": "3.458.0",
"@babel/core": "7.23.3",
"@babel/eslint-parser": "7.23.3",
"@babel/register": "7.22.15",
Expand All @@ -51,7 +51,7 @@
"axios": "1.6.2",
"c8": "8.0.1",
"chai": "4.3.10",
"eslint": "8.53.0",
"eslint": "8.54.0",
"eslint-config-airbnb-base": "15.0.0",
"eslint-plugin-import": "2.29.0",
"eslint-plugin-json": "3.1.0",
Expand Down Expand Up @@ -80,12 +80,11 @@
"lodash.get": "4.4.2",
"lru-cache-ext": "4.0.0",
"minimist": "1.2.8",
"nock": "13.3.8",
"nock": "13.4.0",
"normalize-url": "2.0.1",
"object-scan": "19.0.5",
"smart-fs": "4.0.1",
"timekeeper": "2.3.1",
"tmp": "0.2.1",
"xml2js": "0.6.2"
"tmp": "0.2.1"
}
}
2 changes: 1 addition & 1 deletion src/modules/request-recorder.js
Expand Up @@ -224,7 +224,7 @@ export default (opts) => {
const responseBody = tryParseJson([
healSqsSendMessageBatch
].reduce(
(respBody, fn) => fn(requestBodyString, respBody, scope),
(respBody, fn) => fn(requestBodyString, respBody, scope, req),
interceptor.body
));
// eslint-disable-next-line no-param-reassign
Expand Down
82 changes: 14 additions & 68 deletions src/modules/request-recorder/heal-sqs-send-message-batch.js
@@ -1,75 +1,21 @@
import crypto from 'crypto';
import qs from 'querystring';
import get from 'lodash.get';
import { tryParseJson } from './util.js';

import xml2js from 'xml2js';

const parseRequestBody = (body) => Object.values(Object
.entries(qs.parse(body))
.filter(([k, v]) => k.startsWith('SendMessageBatchRequestEntry.'))
.sort((a, b) => a[0].localeCompare(b[0]))
.map(([k, v]) => [k.split('.'), v])
.reduce((p, [k, v]) => {
if (p[k[1]] === undefined) {
Object.assign(p, { [k[1]]: {} });
}
Object.assign(p[k[1]], { [k[2]]: v });
return p;
}, {}));

const parseResponseBody = (body) => {
let parsed = null;
xml2js.parseString(body, (err, result) => {
parsed = result;
});
return parsed;
};

export default (requestBody, responseBody, scope) => {
export default (requestBody, responseBody, scope, req) => {
if (
!/^https:\/\/sqs\.[a-z0-9-]+\.amazonaws\.com:443$/.test(scope.basePath)
|| !responseBody.startsWith('<?xml version="1.0"?><SendMessageBatchResponse')) {
scope?.basePath !== 'https://sqs.us-west-2.amazonaws.com:443'
|| req?.options?.headers?.['x-amz-target'] !== 'AmazonSQS.SendMessageBatch'
) {
return responseBody;
}

const responseBodyParsed = parseResponseBody(responseBody);

const resultEntries = parseRequestBody(requestBody)
.map(({ Id, MessageBody }, idx) => [
'<SendMessageBatchResultEntry>',
`<Id>${Id}</Id>`,
`<MessageId>${
get(responseBodyParsed, [
'SendMessageBatchResponse',
'SendMessageBatchResult',
0,
'SendMessageBatchResultEntry',
idx,
'MessageId'
], crypto.randomUUID())
}</MessageId>`,
`<MD5OfMessageBody>${
crypto.createHash('md5').update(MessageBody).digest('hex')
}</MD5OfMessageBody>`,
'</SendMessageBatchResultEntry>'
].join(''));
return [
'<?xml version="1.0"?>',
'<SendMessageBatchResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">',
'<SendMessageBatchResult>',
...resultEntries,
'</SendMessageBatchResult>',
'<ResponseMetadata>',
`<RequestId>${
get(responseBodyParsed, [
'SendMessageBatchResponse',
'ResponseMetadata',
0,
'RequestId',
0
], crypto.randomUUID())
}</RequestId>`,
'</ResponseMetadata>',
'</SendMessageBatchResponse>'
].join('');
const requestJson = tryParseJson(requestBody);
const responseJson = tryParseJson(responseBody);
return {
Successful: requestJson.Entries.map(({ Id, MessageBody }, idx) => ({
Id,
MessageId: responseJson?.Successful?.[idx]?.MessageId || crypto.randomUUID(),
MD5OfMessageBody: crypto.createHash('md5').update(MessageBody).digest('hex')
}))
};
};
Expand Up @@ -3,8 +3,24 @@
"scope": "https://sqs.us-west-2.amazonaws.com:443",
"method": "POST",
"path": "/",
"body": "Action=SendMessageBatch&QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F123456789101%2Fservice-name-data-local-SomeQueue&SendMessageBatchRequestEntry.1.Id=4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f&SendMessageBatchRequestEntry.1.MessageBody=%7B%22k%22%3A1%7D&SendMessageBatchRequestEntry.2.Id=743966ceb52ce2e8c7a2424f4d652e3b7936f1ee&SendMessageBatchRequestEntry.2.MessageBody=%7B%22k%22%3A2%7D&Version=2012-11-05",
"body": {
"Entries": [
{
"Id": "4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f",
"MessageBody": "{\"k\":1}"
}
],
"QueueUrl": "https://sqs.us-west-2.amazonaws.com/123456789101/service-name-data-local-SomeQueue"
},
"status": 200,
"response": "<?xml version=\"1.0\"?><SendMessageBatchResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><SendMessageBatchResult><SendMessageBatchResultEntry><Id>1f3e83452c88b7db5f70c88993f2cd01805781d6</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>28d95ddcdef4dd4a840a9ad0b8ce012f</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>65560e96a17b1a8e528af5f44e5e03f8c994defb</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>a19e59607fd90be4aad9dfb4e28f8f10</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>7b8f9a140c0136e375f4beeeabb4543fc4ff96da</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>578e913dec50e64f54de7bb6f6f1499a</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>b31b152e550baf6cb0d0ed09d7f3ea198df6f1ec</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>bb7085d918b968925ccd79f65a79687d</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>497ace5b52d7aceb1d4c02ff9eb69b45338d9911</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>f4b64de266f1da64a937b45ec616429f</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>45a78a750ff2ccd5e623688e6cd9339003d64727</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>8d5322365eed12eeffbf018831c52ff0</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>58662f2ca5604cec4d9720520f70cf22c9aacd67</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>3048175da2cdc95b252cbe609c153833</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>dcad1b9d4d5003a6361f10176ef563a818e54473</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>80fdbfc6224ff8aa28414fa174f35a7e</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>aeb7a05b8ef9593bc3c6954019e09cdfab78f10d</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>70ba32559cf8f5b20cd7170eeb2364d3</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>90056d4b9acac1c9b6243a1a7a635b022aa0d31f</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>3c4a7771474a18a8a1b9d648e1c46134</MD5OfMessageBody></SendMessageBatchResultEntry></SendMessageBatchResult><ResponseMetadata><RequestId>584b2818-1c3b-5bfd-97e0-7d388e494f1e</RequestId></ResponseMetadata></SendMessageBatchResponse>"
"response": {
"Successful": [
{
"Id": "feabf4c420f7eec1fbd3ad1b74e972af9f879cad",
"MessageId": "e40625e7-e66f-4c6c-8d9b-7bb8944b0108",
"MD5OfMessageBody": "some-bad-hash45be96b2d5b9d22cdc4"
}
]
}
}
]
Expand Up @@ -3,20 +3,46 @@
"scope": "https://sqs.us-west-2.amazonaws.com:443",
"method": "POST",
"path": "/",
"body": "QueueUrl=https%3A%2F%2Fsqs.us-west-2.amazonaws.com%2F123456789101%2Fservice-name-data-local-SomeQueue&SendMessageBatchRequestEntry.1.Id=4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f&SendMessageBatchRequestEntry.1.MessageBody=%7B%22k%22%3A1%7D&SendMessageBatchRequestEntry.2.Id=743966ceb52ce2e8c7a2424f4d652e3b7936f1ee&SendMessageBatchRequestEntry.2.MessageBody=%7B%22k%22%3A2%7D&Action=SendMessageBatch&Version=2012-11-05",
"body": {
"Entries": [
{
"Id": "4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f",
"MessageBody": "{\"k\":1}"
},
{
"Id": "743966ceb52ce2e8c7a2424f4d652e3b7936f1ee",
"MessageBody": "{\"k\":2}"
}
],
"QueueUrl": "https://sqs.us-west-2.amazonaws.com/123456789101/service-name-data-local-SomeQueue"
},
"status": 200,
"response": "<?xml version=\"1.0\"?><SendMessageBatchResponse xmlns=\"http://queue.amazonaws.com/doc/2012-11-05/\"><SendMessageBatchResult><SendMessageBatchResultEntry><Id>4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>e59138f35192e320088b83d28388d6bb</MD5OfMessageBody></SendMessageBatchResultEntry><SendMessageBatchResultEntry><Id>743966ceb52ce2e8c7a2424f4d652e3b7936f1ee</Id><MessageId>c0004b0c-ea00-498a-a5a2-362703c0b621</MessageId><MD5OfMessageBody>0dc3f48bc3e78aed8f69f72be8a11087</MD5OfMessageBody></SendMessageBatchResultEntry></SendMessageBatchResult><ResponseMetadata><RequestId>584b2818-1c3b-5bfd-97e0-7d388e494f1e</RequestId></ResponseMetadata></SendMessageBatchResponse>",
"response": {
"Successful": [
{
"Id": "4f494d6b422d1e5fbbe6b6d82584ce7f70c1530f",
"MessageId": "e40625e7-e66f-4c6c-8d9b-7bb8944b0108",
"MD5OfMessageBody": "e59138f35192e320088b83d28388d6bb"
},
{
"Id": "743966ceb52ce2e8c7a2424f4d652e3b7936f1ee",
"MessageId": "a38aa57b-eaf7-401c-b78c-cf900009a8ac",
"MD5OfMessageBody": "0dc3f48bc3e78aed8f69f72be8a11087"
}
]
},
"reqheaders": {
"amz-sdk-invocation-id": "e9725510-7b42-4901-b553-969b5a03e7d4",
"amz-sdk-request": "attempt=1; max=3",
"authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXXX/19700101/us-west-2/sqs/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=46051a63bda908cbd07034a1a035c6fc53cacb9b617264fbf9fd1b6f27a62f5b",
"content-length": "416",
"content-type": "application/x-www-form-urlencoded",
"authorization": "AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXXXXXXX/19700101/us-west-2/sqs/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-target;x-amz-user-agent, Signature=2af4a0ee820b745f53c3313dd7eb7eef53ba8e25b96f79f4f58cc53aedc39000",
"content-length": "261",
"content-type": "application/x-amz-json-1.0",
"host": "sqs.us-west-2.amazonaws.com",
"user-agent": "aws-sdk-js/3.370.0 ua/2.0 os/linux#5.4.0-153-generic lang/js md/nodejs#16.20.1 api/sqs#3.370.0",
"x-amz-content-sha256": "5f6cdab08798db82adcf77e1bdef480fb8fe70e558deeeb78045a5bfcf49cc67",
"user-agent": "aws-sdk-js/3.458.0 ua/2.0 os/linux#5.4.0-166-generic lang/js md/nodejs#18.18.2 api/sqs#3.458.0",
"x-amz-content-sha256": "42d9205526e005eece0404131937f30da55578dcb4a17bdd14751d2706474acf",
"x-amz-date": "19700101T000000Z",
"x-amz-user-agent": "aws-sdk-js/3.385.0"
"x-amz-target": "AmazonSQS.SendMessageBatch",
"x-amz-user-agent": "aws-sdk-js/3.458.0"
}
}
]

0 comments on commit 8790d13

Please sign in to comment.