Hello all,
When trying to do a api callout to the seafile server to upload files of binary types I continuously am running into a 502 error as shown in the debug logs:
I am utilizing this function in order to remove padding from the XLSX file and upload the file into the system:
public static SeaFileWrapper uploadFile(Blob file_body, String file_name, String reqEndPoint, String token){
// Repost of code with fix for file corruption issue
// Orignal code postings and explanations
// http://enreeco.blogspot.in/2013/01/salesforce-apex-post-mutipartform-data.html
// http://salesforce.stackexchange.com/questions/24108/post-multipart-without-base64-encoding-the-body
// Additional changes commented GW: that fix issue with occasional corruption of files
String boundary = '----------------------------741e90d31eff';
String header = '--' + boundary + '\nContent-Disposition: form-data; name="parent_dir"\n\n/Case 1100-1199/00001177\n';
header += '--' + boundary + '\nContent-Disposition: form-data; name="replace"\n\n1\n';
header = '--' + boundary + '\nContent-Disposition: form-data; name="file"; filename="'+file_name+'";\nContent-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document';//TODO CONTENT-TYPE MAY NEED TO BE DYNAMIC
System.debug(header);
// GW: Do not prepend footer with \r\n, you'll see why in a moment
String footer = '--'+boundary+'--';
//system.debug(header);
// String footer = '--' + boundary;
String headerEncoded = EncodingUtil.base64Encode(Blob.valueOf(header+'\r\n\r\n'));
while(headerEncoded.endsWith('='))
{
header+=' ';
headerEncoded = EncodingUtil.base64Encode(Blob.valueOf(header+'\r\n\r\n'));
}
String bodyEncoded = EncodingUtil.base64Encode(file_body);
system.debug(bodyEncoded);
// GW: Do not encode footer yet
// String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
Blob bodyBlob = null;
String last4Bytes = bodyEncoded.substring(bodyEncoded.length()-4,bodyEncoded.length());
system.debug('last 4 bytes is: ' + last4Bytes);
// GW: Replacing this entire section
/*
if(last4Bytes.endsWith('='))
{
Blob decoded4Bytes = EncodingUtil.base64Decode(last4Bytes);
HttpRequest tmp = new HttpRequest();
tmp.setBodyAsBlob(decoded4Bytes);
String last4BytesFooter = tmp.getBody()+footer;
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded.substring(0,bodyEncoded.length()-4)+EncodingUtil.base64Encode(Blob.valueOf(last4BytesFooter)));
}
else
{
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
}
*/
// GW: replacement section to get rid of padding without corrupting data
if(last4Bytes.endsWith('==')) {
system.debug('mb in IF');
// footer += '\r\nContent-Disposition: form-data; name="parent_dir"\r\n\r\n/Case 1100-1199/00001177\r\n';
// footer += '\r\nContent-Disposition: form-data; name="replace"\r\n\r\n1\r\n';
// footer += boundary;
// The '==' sequence indicates that the last group contained only one 8 bit byte
// 8 digit binary representation of CR is 00001101
// 8 digit binary representation of LF is 00001010
// Stitch them together and then from the right split them into 6 bit chunks
// 0000110100001010 becomes 0000 110100 001010
// Note the first 4 bits 0000 are identical to the padding used to encode the
// second original 6 bit chunk, this is handy it means we can hard code the response in
// The decimal values of 110100 001010 are 52 10
// The base64 mapping values of 52 10 are 0 K
// See http://en.wikipedia.org/wiki/Base64 for base64 mapping table
// Therefore, we replace == with 0K
// Note: if using \n\n instead of \r\n replace == with 'oK'
last4Bytes = last4Bytes.substring(0,2) + '0K';
bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
// We have appended the \r\n to the Blob, so leave footer as it is.
String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
} else if(last4Bytes.endsWith('=')) {
system.debug('mb in ELSE IF');
// footer += '\r\nContent-Disposition: form-data; name="parent_dir"\r\n\r\n/Case 1100-1199/00001177\r\n';
// footer += boundary + '\r\nContent-Disposition: form-data; name="replace"\r\n\r\n1\r\n';
// footer += boundary+'\r\n';
// '=' indicates that encoded data already contained two out of 3x 8 bit bytes
// We replace final 8 bit byte with a CR e.g. \r
// 8 digit binary representation of CR is 00001101
// Ignore the first 2 bits of 00 001101 they have already been used up as padding
// for the existing data.
// The Decimal value of 001101 is 13
// The base64 value of 13 is N
// Therefore, we replace = with N
// Note: if using \n instead of \r replace = with 'K'
last4Bytes = last4Bytes.substring(0,3) + 'K';
bodyEncoded = bodyEncoded.substring(0,bodyEncoded.length()-4) + last4Bytes;
// We have appended the CR e.g. \r, still need to prepend the line feed to the footer
footer = '\n' + footer;
String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
} else {
system.debug('mb in ELSE');
// Prepend the CR LF to the footer
footer = '\r\n' + footer;
String footerEncoded = EncodingUtil.base64Encode(Blob.valueOf(footer));
bodyBlob = EncodingUtil.base64Decode(headerEncoded+bodyEncoded+footerEncoded);
}
system.debug(reqEndPoint);
// String token = authentication(sfiv);
HttpRequest req = new HttpRequest();
//req.setHeader('Accept', '*/*');
req.setHeader( 'Authorization', 'Token ' + token);
req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
// req.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
// req.setHeader('fileName', file_name);
// req.setHeader( 'parent_dir', '/Case 1100-1199/00001177');
// req.setHeader( 'replace', '1');
req.setMethod('POST');
//req.setEndpoint(reqEndPoint);
req.setBodyAsBlob(bodyBlob);
req.setHeader('Content-Length',String.valueOf(req.getBody().length()) );
system.debug(req.getHeader('Authorization'));
req.setTimeout(120000);
system.debug(req);
Http http = new Http();
HTTPResponse res = http.send(req);
system.debug(res.getBody());
List<SeaFileWrapper> filew = fileWrapperParse(res.getBody());
return filew[0];
}
I have removed the parent and the replace pieces of the body callout for now in hopes of getting anything besides this 502 error. Is there anything I am missing like a header or param?
Thank you in advance!