X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Finternet.cc;h=c0a29bfbdf13cfbc52d93b2e9f1d997fe247832d;hb=422be0eece2bf6ee80db1d3c21553cd82efff789;hp=c28e650fdd92f4514bb850dacd13c7869b040ad4;hpb=8c7a308c03e4b4196b4e2379a26d432b100ae2b1;p=dcpomatic.git diff --git a/src/lib/internet.cc b/src/lib/internet.cc index c28e650fd..c0a29bfbd 100644 --- a/src/lib/internet.cc +++ b/src/lib/internet.cc @@ -1,30 +1,34 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ -#include +#include "scoped_temporary.h" +#include "compose.hpp" +#include "exceptions.h" +#include +#include +#include #include #include #include -#include -#include -#include "util.h" -#include "safe_stringstream.h" +#include +#include #include "i18n.h" @@ -32,6 +36,7 @@ using std::string; using std::list; using boost::optional; using boost::function; +using boost::algorithm::trim; static size_t get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream) @@ -45,17 +50,24 @@ get_from_zip_url_data (void* buffer, size_t size, size_t nmemb, void* stream) * @param load Function passed a (temporary) filesystem path of the unpacked file. */ optional -get_from_zip_url (string url, string file, function load) +get_from_zip_url (string url, string file, bool pasv, function load) { /* Download the ZIP file to temp_zip */ CURL* curl = curl_easy_init (); curl_easy_setopt (curl, CURLOPT_URL, url.c_str ()); - + ScopedTemporary temp_zip; FILE* f = temp_zip.open ("wb"); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_zip_url_data); curl_easy_setopt (curl, CURLOPT_WRITEDATA, f); curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0); + curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0); + if (!pasv) { + curl_easy_setopt (curl, CURLOPT_FTPPORT, "-"); + } + + /* Maximum time is 20s */ + curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20); CURLcode const cr = curl_easy_perform (curl); @@ -66,17 +78,17 @@ get_from_zip_url (string url, string file, function (_("Could not open downloaded ZIP file")); } - + struct zip_file* zip_file = zip_fopen (zip, file.c_str(), 0); if (!zip_file) { return optional (_("Unexpected ZIP file contents")); } - + ScopedTemporary temp_cert; f = temp_cert.open ("wb"); char buffer[4096]; @@ -88,12 +100,11 @@ get_from_zip_url (string url, string file, function (); } - static size_t ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) { @@ -102,21 +113,23 @@ ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) for (size_t i = 0; i < (size * nmemb); ++i) { *s += b[i]; } - return nmemb; + return size * nmemb; } list -ftp_ls (string url) +ftp_ls (string url, bool pasv) { CURL* curl = curl_easy_init (); if (!curl) { - return list (); + throw NetworkError ("could not set up curl"); } if (url.substr (url.length() - 1, 1) != "/") { url += "/"; } curl_easy_setopt (curl, CURLOPT_URL, url.c_str ()); + /* 20s timeout */ + curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20); string ls_raw; struct curl_slist* commands = 0; @@ -125,15 +138,22 @@ ftp_ls (string url) curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ls_raw); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_ls_data); curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0); + curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0); + curl_easy_setopt (curl, CURLOPT_VERBOSE, 1); + if (!pasv) { + curl_easy_setopt (curl, CURLOPT_FTPPORT, "-"); + } CURLcode const r = curl_easy_perform (curl); if (r != CURLE_OK) { - return list (); + curl_easy_cleanup (curl); + throw NetworkError (curl_easy_strerror (r)); } - SafeStringStream s (ls_raw); + locked_stringstream s (ls_raw); list ls; while (s.good ()) { - string const line = s.getline (); + string line = s.getline (); + trim (line); if (line.length() > 55) { string const file = line.substr (55); if (file != "." && file != "..") {