I searched internet for handling binary data in AWS Gateway for more than a week but I could not find any working sample code. Every where there was a bits and pieces but no one explained or provided sample working code through which I can upload an image or render an image.
So I am sharing below working sample code to handle binary data in AWS Gateway Proxy+
Below is the NodeJS example to upload and render image or binary data.
By default AWS Gateway does not enable processing binary data. So we have to go to settings and enable binary data as shown below
Copy this code in lambda index.js file and Deploy it.
const https = require('https');
const AWS = require('aws-sdk');
exports.handler = async (event) => {
let response = '';
let options = {
method: event.httpMethod,
hostname: '',
path: ''
};
let apiResponse = await proxyRequest(options, event.body, event.isBase64Encoded);
// Handling returning binary response from server
let isBase64 = false;
if((apiResponse.headers && apiResponse.headers['content-disposition'] && apiResponse.headers['content-disposition'].includes('attachment')) ||
(apiResponse.headers['content-type'] && apiResponse.headers['content-type'].includes('image'))) {
isBase64 = true;
}
response = {
"statusCode": apiResponse.statusCode,
"headers": apiResponse.headers,
"body": apiResponse.data,
"isBase64Encoded": isBase64
};
return response;
};
function proxyRequest(options, requestBody, isBodyBase64Encoded) {
return new Promise((resolve, reject) => {
let request = https.request(options, response => {
let bodyData = [];
response.on('data', chunk => {
bodyData.push(chunk);
});
response.on('end', () => {
try {
let resData = null;
if((response.headers && response.headers['content-disposition'] && response.headers['content-disposition'].includes('attachment')) ||
(response.headers['content-type'] && response.headers['content-type'].includes('image'))) {
resData = bodyData.length > 0 ? Buffer.concat(bodyData).toString('base64') : null;
console.log('base64 chunks');
}
else {
resData = bodyData.length > 0 ? Buffer.concat(bodyData).toString() : null;
}
resolve({
statusCode: response.statusCode,
headers: response.headers,
data: resData
});
}
catch (e) {
console.log('Error processing response: ', e);
reject(e);
}
});
response.on('error', err => {
console.log('unexpected error: ', err);
reject(err);
});
});
if (requestBody !== null)
request.write(requestBody, isBodyBase64Encoded ? 'base64' : 'utf8');
request.end();
});
}
Comments
Post a Comment