UrlAgent.coffee 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. request = require 'request'
  2. _ = require "underscore"
  3. urlValidator = require 'valid-url'
  4. Settings = require 'settings-sharelatex'
  5. { InvalidUrlError, UrlFetchFailedError } = require './LinkedFilesErrors'
  6. LinkedFilesHandler = require './LinkedFilesHandler'
  7. module.exports = UrlAgent = {
  8. createLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  9. linkedFileData = @._sanitizeData(linkedFileData)
  10. @_getUrlStream project_id, linkedFileData, user_id, (err, readStream) ->
  11. return callback(err) if err?
  12. readStream.on "error", callback
  13. readStream.on "response", (response) ->
  14. if 200 <= response.statusCode < 300
  15. readStream.resume()
  16. LinkedFilesHandler.importFromStream project_id,
  17. readStream,
  18. linkedFileData,
  19. name,
  20. parent_folder_id,
  21. user_id,
  22. (err, file) ->
  23. return callback(err) if err?
  24. callback(null, file._id) # Created
  25. else
  26. error = new UrlFetchFailedError("url fetch failed: #{linkedFileData.url}")
  27. error.statusCode = response.statusCode
  28. callback(error)
  29. refreshLinkedFile: (project_id, linkedFileData, name, parent_folder_id, user_id, callback) ->
  30. @createLinkedFile project_id, linkedFileData, name, parent_folder_id, user_id, callback
  31. _sanitizeData: (data) ->
  32. return {
  33. provider: data.provider
  34. url: @._prependHttpIfNeeded(data.url)
  35. }
  36. _getUrlStream: (project_id, data, current_user_id, callback = (error, fsPath) ->) ->
  37. callback = _.once(callback)
  38. url = data.url
  39. if !urlValidator.isWebUri(url)
  40. return callback(new InvalidUrlError("invalid url: #{url}"))
  41. url = @_wrapWithProxy(url)
  42. readStream = request.get(url)
  43. readStream.pause()
  44. callback(null, readStream)
  45. _prependHttpIfNeeded: (url) ->
  46. if !url.match('://')
  47. url = 'http://' + url
  48. return url
  49. _wrapWithProxy: (url) ->
  50. # TODO: Consider what to do for Community and Enterprise edition?
  51. if !Settings.apis?.linkedUrlProxy?.url?
  52. throw new Error('no linked url proxy configured')
  53. return "#{Settings.apis.linkedUrlProxy.url}?url=#{encodeURIComponent(url)}"
  54. }