From 5e21812e17fcc63b544fbeb2c5923a1b1867026a Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Fri, 22 Sep 2023 08:50:26 +0100 Subject: [PATCH] Merge pull request #14925 from overleaf/revert-14923-csh-2023-09-20-double-revert Revert "Csh 2023 09 20 double revert" and remove content-length header GitOrigin-RevId: 04e88bb46ac0de221325f98805d471dcf4956758 --- .../LinkedFiles/LinkedFilesController.js | 14 +++- .../app/src/Features/LinkedFiles/UrlAgent.js | 84 +++++++++---------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js index 9b4fe6dcd1..3179be0109 100644 --- a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js +++ b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js @@ -177,10 +177,16 @@ module.exports = LinkedFilesController = { plainTextResponse(res, 'Could not get output file') } else if (error instanceof UrlFetchFailedError) { res.status(422) - plainTextResponse( - res, - `Your URL could not be reached (${error.statusCode} status code). Please check it and try again.` - ) + if (error.cause instanceof FileTooLargeError) { + plainTextResponse(res, 'File too large') + } else { + plainTextResponse( + res, + `Your URL could not be reached (${ + error.info?.status || error.cause?.info?.status + } status code). Please check it and try again.` + ) + } } else if (error instanceof InvalidUrlError) { res.status(422) plainTextResponse( diff --git a/services/web/app/src/Features/LinkedFiles/UrlAgent.js b/services/web/app/src/Features/LinkedFiles/UrlAgent.js index 325896c116..1ba52b40fd 100644 --- a/services/web/app/src/Features/LinkedFiles/UrlAgent.js +++ b/services/web/app/src/Features/LinkedFiles/UrlAgent.js @@ -1,71 +1,61 @@ const logger = require('@overleaf/logger') -const request = require('request') -const _ = require('underscore') const urlValidator = require('valid-url') const { InvalidUrlError, UrlFetchFailedError } = require('./LinkedFilesErrors') const LinkedFilesHandler = require('./LinkedFilesHandler') const UrlHelper = require('../Helpers/UrlHelper') +const { fetchStream, RequestFailedError } = require('@overleaf/fetch-utils') +const { callbackify } = require('../../util/promises') +const { FileTooLargeError } = require('../Errors/Errors') -function createLinkedFile( +async function createLinkedFile( projectId, linkedFileData, name, parentFolderId, - userId, - callback + userId ) { logger.info( { projectId, userId, url: linkedFileData.url }, 'create linked file' ) linkedFileData = _sanitizeData(linkedFileData) - _getUrlStream(projectId, linkedFileData, userId, (err, readStream) => { - if (err) { - return callback(err) + const fetchUrl = _getUrl(projectId, linkedFileData, userId) + try { + const readStream = await fetchStream(fetchUrl) + const file = await LinkedFilesHandler.promises.importFromStream( + projectId, + readStream, + linkedFileData, + name, + parentFolderId, + userId + ) + return file._id + } catch (error) { + if (error instanceof RequestFailedError && /too large/.test(error.body)) { + throw new FileTooLargeError('file too large', { + url: linkedFileData.url, + }).withCause(error) } - readStream.on('error', callback) - readStream.on('response', response => { - if (response.statusCode >= 200 && response.statusCode < 300) { - LinkedFilesHandler.importFromStream( - projectId, - readStream, - linkedFileData, - name, - parentFolderId, - userId, - (err, file) => { - if (err) { - return callback(err) - } - callback(null, file._id) - } - ) // Created - } else { - const error = new UrlFetchFailedError( - `url fetch failed: ${linkedFileData.url}` - ) - error.statusCode = response.statusCode - callback(error) - } - }) - }) + throw new UrlFetchFailedError('url fetch failed', { + url: linkedFileData.url, + }).withCause(error) + } } -function refreshLinkedFile( +async function refreshLinkedFile( projectId, linkedFileData, name, parentFolderId, - userId, - callback + userId ) { - createLinkedFile( + return await createLinkedFile( projectId, linkedFileData, name, parentFolderId, - userId, - callback + userId ) } @@ -76,15 +66,17 @@ function _sanitizeData(data) { } } -function _getUrlStream(projectId, data, currentUserId, callback) { - callback = _.once(callback) +function _getUrl(projectId, data, currentUserId) { let { url } = data if (!urlValidator.isWebUri(url)) { - return callback(new InvalidUrlError(`invalid url: ${url}`)) + throw new InvalidUrlError(`invalid url: ${url}`) } url = UrlHelper.wrapUrlWithProxy(url) - const readStream = request.get(url) - callback(null, readStream) + return url } -module.exports = { createLinkedFile, refreshLinkedFile } +module.exports = { + createLinkedFile: callbackify(createLinkedFile), + refreshLinkedFile: callbackify(refreshLinkedFile), + promises: { createLinkedFile, refreshLinkedFile }, +}