aem-upload icon indicating copy to clipboard operation
aem-upload copied to clipboard

not valid JSON while parsing '<html>\n`

Open sewalsberger opened this issue 2 years ago • 1 comments

Hi, i have a problem uploading files to the aem and due to this problem i dont know the "real" problem.

Currently the Module cant parse the response it receives, because it is not a JSON content.

I try to upload several files to different directories by using the file "FileSystemUpload" class several times (once for each target directory)

e.g. first call with files:

  • content/dam/US/pdf/subdir/file_1

second call with file:

  • content/dam/US/pdf/subdir/sub_sub_dir/file_2
  • content/dam/US/pdf/subdir/sub_sub_dir/file_3

third call with file:

  • content/dam/US/pdf/file_4

Expected Behaviour

Upload works fine for each call

Actual Behaviour

During the upload for the "second call" the module is not able to parse the response, because its not a JSON content.

UploadError: Unexpected token '<', "<html>
<he"... is not valid JSON while parsing '<html>
<head>
    <title>Content created'
    at UploadError.fromError (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/block/upload-error.js:72:20)
    at TransferController.<anonymous> (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/aem/aemupload.js:53:43)
    at TransferController.emit (node:events:514:28)
    at TransferController.notifyError (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/controller/transfercontroller.js:186:14)
    at AEMInitiateUpload.execute (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/functions/aeminitiateupload.js:171:28)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async executeBatch (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/generator/mapconcurrent.js:79:22)
    at async waitResult (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/generator/mapconcurrent.js:35:37)
    at async MapConcurrent.execute (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/generator/mapconcurrent.js:[159](https://gitlab.aldidevops.com/n-tier-application/adobe-asset-upload-test/-/jobs/13520219#L159):20)
    at async FilterFailedAssets.execute (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/functions/filterfailedassets.js:30:26) {
  code: 'EUNKNOWN',
  innerStack: `SyntaxError: Unexpected token '<', "<html>\n` +
    `<he"... is not valid JSON while parsing '<html>\n` +
    '<head>\n' +
    "    <title>Content created'\n" +
    '    at JSON.parse (<anonymous>)\n' +
    '    at parseJson (/builds/n-tier-application/adobe-asset-upload-test/node_modules/json-parse-better-errors/index.js:7:17)\n' +
    '    at /builds/n-tier-application/adobe-asset-upload-test/node_modules/node-fetch-npm/src/body.js:96:50\n' +
    '    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
    '    at async Immediate.invoke (/builds/n-tier-application/adobe-asset-upload-test/node_modules/@adobe/httptransfer/lib/retry.js:[171](https://gitlab.aldidevops.com/n-tier-application/adobe-asset-upload-test/-/jobs/13520219#L171):32)',
  uploadError: true
}

Reproduce Scenario (including but not limited to)

This is my current used code

  const options = new FileSystemUploadOptions()
// uploadUrl will be dynamically created - depending on the folder structure 
// (e.g. https://author-xxxx.adobeaemcloud.com/content/dam/US/pdf/subdir/sub_sub_dir)
        .withUrl(uploadUrl)  
        .withHttpOptions(
            {
                headers: {
                    Authorization: 'Bearer ' + accessToken
                }
            }
        );

    const fileUpload = new FileSystemUpload();
    // filesToUpload == list of local file paths
    await fileUpload.upload(options, filesToUpload
    ).then(result => {
        const {detailedResult = []} = result;
        detailedResult.forEach((fileResult) => {
            const {result = {}} = fileResult;
            const {errors = []} = result;
            // ATM we dont need the result object
            // console.log(`Result: ${fileResult}`)
            if (errors.length === 0) {
                console.info(`>>>>> Successfully uploaded files <<<<<`);
            } else {
                process.exitCode = 1;
                console.error(">>>>> Upload failed <<<<<");
                errors.forEach((err) => {
                    console.error(err);
                });
            }
        });
    }).catch(err => {
        console.error("Unexpected Error during Upload - ", err.message);
        console.error(err);
        process.exitCode = 1;
    });

Steps to Reproduce

Platform and Version

Sample Code that illustrates the problem

Logs taken while reproducing problem

sewalsberger avatar Nov 09 '23 10:11 sewalsberger

Also after this request fails i have a create folder called "sub_sub_dir.initiateUpload.json"

This folder is located in the same level as from the failed called

in my sample: failed call: content/dam/US/pdf/subdir/sub_sub_dir/file_2

subdir.initiateUpload.json folder: content/dam/US/pdf/subdir/sub_sub_dir.initiateUpload.json

sewalsberger avatar Nov 09 '23 10:11 sewalsberger