Извлечение архива с исходным кодом GitHub без проблем с CORS

#javascript #github #cors

#javascript #github #cors

Вопрос:

Возможно ли загрузить архив с общедоступного репозитория GitHub непосредственно в браузере без CORS-проксирования?

 fetch('https://api.github.com/repos/vadimkantorov/torchwav/tarball/master')

/*Refused to connect to 'https://api.github.com/repos/vadimkantorov/torchwav/tarball/master' because it violates the following Content Security Policy directive: "connect-src mc.admetrica.ru wss://webasr.voicetech.yandex.net mc.yandex.ru yandex.ru".

(anonymous) @ VM24:1
VM24:1 Refused to connect to 'https://api.github.com/repos/vadimkantorov/torchwav/tarball/master' because it violates the document's Content Security Policy.
(anonymous) @ VM24:1
Promise {<rejected>: TypeError: Failed to fetch
    at <anonymous>:1:1}
VM24:1 Uncaught (in promise) TypeError: Failed to fetch
    at <anonymous>:1:1
*/

fetch('https://github.com/vadimkantorov/torchwav/archive/master.tar.gz')
/*VM52:1 Refused to connect to 'https://github.com/vadimkantorov/torchwav/archive/master.tar.gz' because it violates the following Content Security Policy directive: "connect-src mc.admetrica.ru wss://webasr.voicetech.yandex.net mc.yandex.ru yandex.ru".
(anonymous) @ VM52:1
VM52:1 Refused to connect to 'https://github.com/vadimkantorov/torchwav/archive/master.tar.gz' because it violates the document's Content Security Policy.*/
  

Комментарии:

1. По ссылке «загрузить» получите доступ к вашему узловому серверу, который извлекает архив, и отправьте его обратно в ваш пользовательский интерфейс.

2. Это правильное решение, как и проксирование CORS, но мне интересно, есть ли другой способ обойти. Может быть, специфично для GitHub? Например. можно было бы запросить все файлы по отдельности через GitHub API, но это было бы медленно и потребляло бы квоту API…

Ответ №1:

Это невозможно сделать во внешнем интерфейсе (то есть в браузере), поскольку служба, предоставляющая эти архивы, не поддерживает CORS. На самом деле вы не хотите загружать один и тот же архив снова и снова для каждого пользователя в любом случае, поскольку (а) это медленно и неудобно для пользователя и (б) GitHub может расценить это как DDoS и приостановить работу вашего репозитория. Запрашивать у каждого пользователя каждый файл через API аналогично проблематично и даже медленнее.

Вы захотите обеспечить какое-то кэширование в серверной части, загрузив этот архив один раз и предоставив доступ к нужным вам файлам через ваше приложение. Это будет намного быстрее и приведет к использованию намного меньшей пропускной способности. Это также означает, что если пользователь перезагрузит страницу, он получит выгоду от кэширования, которое ваше приложение предоставляет для загруженных файлов, вместо того, чтобы снова загружать те же ресурсы.

Ответ №2:

Просто добавьте URL с https://cors-anywhere.herokuapp.com/

fetch('https://cors-anywhere.herokuapp.com/https://api.github.com/repos/vadimkantorov/torchwav/tarball/master')

Комментарии:

1. Это то, что я имел в виду под CORS-проксированием. Я хотел бы сделать свое клиентское приложение как можно более закрытым и не позволять пользовательскому коду проходить через посреднические прокси (особенно в случае с архивами частного репозитория)

2. Если это общедоступный репозиторий, это не имеет значения. Если он частный, используйте свой собственный сервер. Вы не сделаете этого без прокси, потому что так работают браузеры.