Merge branch 'resolve-url' into 4.0

This commit is contained in:
Simon Kornblith 2013-04-08 18:36:25 -04:00
commit f3bb679ebe
2 changed files with 70 additions and 70 deletions

View file

@ -630,14 +630,11 @@ Zotero.Translate.Sandbox = {
}
}
// Remap attachment (but not link) URLs
var properToProxy = translate.translator[0].properToProxy;
if(properToProxy && item.attachments) {
for(var i=0; i<item.attachments.length; i++) {
var attachment = item.attachments[i];
if(attachment.snapshot !== false && attachment.url) {
attachment.url = properToProxy(attachment.url);
}
for(var i=0; i<item.attachments.length; i++) {
var attachment = item.attachments[i];
if(attachment.url) {
// Remap attachment (but not link) URLs
attachment.url = translate.resolveURL(attachment.url, attachment.snapshot === false);
}
}
}
@ -1185,6 +1182,57 @@ Zotero.Translate.Base.prototype = {
* Return the progress of the import operation, or null if progress cannot be determined
*/
"getProgress":function() { return null },
/**
* Translate a URL to a form that goes through the appropriate proxy, or
* convert a relative URL to an absolute one
*
* @param {String} url
* @param {Boolean} dontUseProxy If true, don't convert URLs to variants
* that use the proxy
* @type String
* @private
*/
"resolveURL":function(url, dontUseProxy) {
const hostPortRe = /^((?:http|https|ftp):)\/\/([^\/]+)/i;
// resolve local URL
var resolved = "";
// convert proxy to proper if applicable
if(hostPortRe.test(url)) {
if(this.translator && this.translator[0]
&& this.translator[0].properToProxy && !dontUseProxy) {
resolved = this.translator[0].properToProxy(url);
} else {
resolved = url;
}
} else if(Zotero.isFx) {
resolved = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService).
newURI(this.location, "", null).resolve(url);
} else if(Zotero.isNode) {
resolved = require('url').resolve(this.location, url);
} else {
var a = document.createElement('a');
a.href = url;
resolved = a.href;
}
/*var m = hostPortRe.exec(resolved);
if(!m) {
throw new Error("Invalid URL supplied for HTTP request: "+url);
} else if(this._translate.document && this._translate.document.location) {
var loc = this._translate.document.location;
if(this._translate._currentState !== "translate" && loc
&& (m[1].toLowerCase() !== loc.protocol.toLowerCase()
|| m[2].toLowerCase() !== loc.host.toLowerCase())) {
throw new Error("Attempt to access "+m[1]+"//"+m[2]+" from "+loc.protocol+"//"+loc.host
+" blocked: Cross-site requests are only allowed during translation");
}
}*/
return resolved;
},
/**
* Executed on translator completion, either automatically from a synchronous scraper or as

View file

@ -195,17 +195,18 @@ Zotero.Utilities.Translate.prototype.loadDocument = function(url, succeeded, fai
* @ignore
*/
Zotero.Utilities.Translate.prototype.processDocuments = function(urls, processor, done, exception) {
var translate = this._translate;
if(typeof(urls) == "string") {
urls = [this._convertURL(urls)];
urls = [translate.resolveURL(urls)];
} else {
for(var i in urls) {
urls[i] = this._convertURL(urls[i]);
urls[i] = translate.resolveURL(urls[i]);
}
}
// Unless the translator has proposed some way to handle an error, handle it
// by throwing a "scraping error" message
var translate = this._translate;
if(exception) {
var myException = function(e) {
var browserDeleted;
@ -300,7 +301,9 @@ Zotero.Utilities.Translate.prototype.processDocuments = function(urls, processor
* @return {Boolean} True if the request was sent, or false if the browser is offline
*/
Zotero.Utilities.Translate.prototype.doGet = function(urls, processor, done, responseCharset) {
var callAgain = false;
var callAgain = false,
me = this,
translate = this._translate;
if(typeof(urls) == "string") {
var url = urls;
@ -309,11 +312,9 @@ Zotero.Utilities.Translate.prototype.doGet = function(urls, processor, done, res
var url = urls.shift();
}
url = this._convertURL(url);
url = translate.resolveURL(url);
var me = this;
this._translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doGet");
translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doGet");
var xmlhttp = Zotero.HTTP.doGet(url, function(xmlhttp) {
try {
if(processor) {
@ -327,9 +328,9 @@ Zotero.Utilities.Translate.prototype.doGet = function(urls, processor, done, res
done();
}
}
me._translate.decrementAsyncProcesses("Zotero.Utilities.Translate#doGet");
translate.decrementAsyncProcesses("Zotero.Utilities.Translate#doGet");
} catch(e) {
me._translate.complete(false, e);
translate.complete(false, e);
}
}, responseCharset, this._translate.cookieSandbox);
}
@ -339,10 +340,10 @@ Zotero.Utilities.Translate.prototype.doGet = function(urls, processor, done, res
* @ignore
*/
Zotero.Utilities.Translate.prototype.doPost = function(url, body, onDone, headers, responseCharset) {
url = this._convertURL(url);
var translate = this._translate;
this._translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doPost");
url = translate.resolveURL(url);
translate.incrementAsyncProcesses("Zotero.Utilities.Translate#doPost");
var xmlhttp = Zotero.HTTP.doPost(url, body, function(xmlhttp) {
try {
onDone(xmlhttp.responseText, xmlhttp);
@ -353,55 +354,6 @@ Zotero.Utilities.Translate.prototype.doPost = function(url, body, onDone, header
}, headers, responseCharset, translate.cookieSandbox ? translate.cookieSandbox : undefined);
}
/**
* Translate a URL to a form that goes through the appropriate proxy, or convert a relative URL to
* an absolute one
*
* @param {String} url
* @type String
* @private
*/
Zotero.Utilities.Translate.prototype._convertURL = function(url) {
const hostPortRe = /^((?:http|https|ftp):)\/\/([^\/]+)/i;
// resolve local URL
var resolved = "";
// convert proxy to proper if applicable
if(hostPortRe.test(url)) {
if(this._translate.translator && this._translate.translator[0]
&& this._translate.translator[0].properToProxy) {
resolved = this._translate.translator[0].properToProxy(url);
} else {
resolved = url;
}
} else if(Zotero.isFx) {
resolved = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService).
newURI(this._translate.location, "", null).resolve(url);
} else if(Zotero.isNode) {
resolved = require('url').resolve(this._translate.location, url);
} else {
var a = document.createElement('a');
a.href = url;
resolved = a.href;
}
/*var m = hostPortRe.exec(resolved);
if(!m) {
throw new Error("Invalid URL supplied for HTTP request: "+url);
} else if(this._translate.document && this._translate.document.location) {
var loc = this._translate.document.location;
if(this._translate._currentState !== "translate" && loc
&& (m[1].toLowerCase() !== loc.protocol.toLowerCase()
|| m[2].toLowerCase() !== loc.host.toLowerCase())) {
throw new Error("Attempt to access "+m[1]+"//"+m[2]+" from "+loc.protocol+"//"+loc.host
+" blocked: Cross-site requests are only allowed during translation");
}
}*/
return resolved;
}
Zotero.Utilities.Translate.prototype.__exposedProps__ = {"HTTP":"r"};
for(var j in Zotero.Utilities.Translate.prototype) {
if(typeof Zotero.Utilities.Translate.prototype[j] === "function" && j[0] !== "_" && j != "Translate") {