I’m finally getting around to testing the breaking changes you made in https://answers.netlify.com/t/changed-behavior-in-function-body-encoding/18991/1 (that said, this URL no longer seems to be available for some reason). But, I’m still having trouble getting a binary upload to work with application/octet-stream
. I’ve updated my test function to use the following code:
var Buffer = require( "buffer" ).Buffer;
export async function handler( event, context ) {
var bodyBuffer = ( event.body instanceof Buffer )
? event.body
: Buffer.from( event.body, ( event.isBase64Encoded ? "base64" : "utf8" ) )
;
// Create a copy of the event for echoing that won't include the massive body.
var eventCopy = { ...event };
delete( eventCopy.body );
return({
statusCode: 200,
body: JSON.stringify({
contentType: event.headers[ "content-type" ],
contentLength: ( +event.headers[ "content-length" ] || "not-provided" ),
bodyLength: bodyBuffer.length,
bodyIsBuffer: ( event.body instanceof Buffer ),
bodyIsString: ( typeof( event.body ) === "string" ),
bodyIsBase64: event.isBase64Encoded,
eventCopy: eventCopy
})
});
}
Now, if I try to upload a file to the given function, I get the following response:
{
"contentType": "application/octet-stream",
"contentLength": 145652,
"bodyLength": 275070,
"bodyIsBuffer": false,
"bodyIsString": true,
"bodyIsBase64": false,
.... truncated ....
}
For some reason, the bodyLength
is showing about 2x the size of the content-length
header.
Also, notice that it is not being Base64 encoded. However, going back to your “breaking changes” announcement from the other week:
If the content-type is anything else, we will base64 encode the body. This will ensure that binary media types like
application/octet-stream
andapplication/pdf
arrive at their final destinations intact.
From that, I would assume that the body should be Base64-encoded.
I am not sure what I am doing wrong?