Explorar o código

added options load-media-error-handling to ignore bad status codes for media files

pussbb %!s(int64=12) %!d(string=hai) anos
pai
achega
5b2983de5e

+ 2 - 0
include/wkhtmltox/loadsettings.hh

@@ -107,6 +107,7 @@ struct DLL_PUBLIC LoadPage {
 
 	//! What should we do about load errors
 	LoadErrorHandling loadErrorHandling;
+	LoadErrorHandling mediaLoadErrorHandling;
 
 	//! Proxy related settings
 	Proxy proxy;
@@ -120,6 +121,7 @@ struct DLL_PUBLIC LoadPage {
 	QString radiobuttonCheckedSvg;
 
 	QString cacheDir;
+	static QList<QString> mediaFilesExtensions;
 };
 
 DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);

+ 11 - 1
src/lib/loadsettings.cc

@@ -34,6 +34,15 @@
 namespace wkhtmltopdf {
 namespace settings {
 
+QList<QString> LoadPage::mediaFilesExtensions = QList<QString> ()
+		<< "css"
+		<< "js"
+		<< "png"
+		<< "jpg"
+		<< "jpeg"
+		<< "gif";
+
+
 LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok) {
 	if (ok) *ok = true;
 	if (!strcasecmp(s, "abort")) return LoadPage::abort;
@@ -142,7 +151,8 @@ LoadPage::LoadPage():
 	blockLocalFileAccess(false),
 	stopSlowScripts(true),
 	debugJavascript(false),
-	loadErrorHandling(abort) {};
+	loadErrorHandling(abort),
+	mediaLoadErrorHandling(ignore) {};
 
 }
 }

+ 2 - 0
src/lib/loadsettings.hh

@@ -113,6 +113,7 @@ struct DLL_PUBLIC LoadPage {
 
 	//! What should we do about load errors
 	LoadErrorHandling loadErrorHandling;
+	LoadErrorHandling mediaLoadErrorHandling;
 
 	//! Proxy related settings
 	Proxy proxy;
@@ -126,6 +127,7 @@ struct DLL_PUBLIC LoadPage {
 	QString radiobuttonCheckedSvg;
 
 	QString cacheDir;
+	static QList<QString> mediaFilesExtensions;
 };
 
 DLL_PUBLIC LoadPage::LoadErrorHandling strToLoadErrorHandling(const char * s, bool * ok=0);

+ 21 - 2
src/lib/multipageloader.cc

@@ -287,8 +287,27 @@ void ResourceObject::error(const QString & str) {
  * \param reply The networkreply that has finished
  */
 void ResourceObject::amfinished(QNetworkReply * reply) {
-	int error = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-	if (error > 399 && httpErrorCode == 0) httpErrorCode = error;
+	int errorCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+	if (errorCode > 399 && httpErrorCode == 0)
+	{
+		QFileInfo fi(reply->url().toString());
+		bool mediaFile = settings::LoadPage::mediaFilesExtensions.contains(fi.completeSuffix().toLower());
+		if ( ! mediaFile) {
+			httpErrorCode = errorCode;
+			return;
+		}
+		if (settings.mediaLoadErrorHandling == settings::LoadPage::abort)
+		{
+			httpErrorCode = errorCode;
+			error(QString("Failed to load ") + reply->url().toString() + " (sometimes it will work just to ignore this error with --load-media-error-handling ignore)");
+		}
+		else {
+			warning(QString("Failed to load %1 (%2)")
+					.arg(reply->url().toString())
+					.arg(settings::loadErrorHandlingToStr(settings.loadErrorHandling))
+					);
+		}
+	}
 }
 
 /*!

+ 1 - 0
src/shared/commonarguments.cc

@@ -203,6 +203,7 @@ void CommandLineParserBase::addPageLoadArgs(LoadPage & s) {
 	addarg("username",0,"HTTP Authentication username", new QStrSetter(s.username, "username"));
 	addarg("password",0,"HTTP Authentication password", new QStrSetter(s.password, "password"));
 	addarg("load-error-handling", 0, "Specify how to handle pages that fail to load: abort, ignore or skip", new LoadErrorHandlingSetting(s.loadErrorHandling, "handler"));
+	addarg("load-media-error-handling", 0, "Specify how to handle media files that fail to load: abort, ignore or skip", new LoadErrorHandlingSetting(s.mediaLoadErrorHandling, "handler"));
 	addarg("custom-header",0,"Set an additional HTTP header (repeatable)", new MapSetter<>(s.customHeaders, "name", "value"));
 	addarg("custom-header-propagation",0,"Add HTTP headers specified by --custom-header for each resource request.", new ConstSetter<bool>(s.repeatCustomHeaders, true));
 	addarg("no-custom-header-propagation",0,"Do not add HTTP headers specified by --custom-header for each resource request.", new ConstSetter<bool>(s.repeatCustomHeaders, true));