diff --git a/modules/helma/Http.js b/modules/helma/Http.js index a379d54c..a3f032eb 100644 --- a/modules/helma/Http.js +++ b/modules/helma/Http.js @@ -18,7 +18,7 @@ /** * @fileoverview Fields and methods of the helma.Http class. *

- * To use this optional module, its repository needs to be added to the + * To use this optional module, its repository needs to be added to the * application, for example by calling app.addRepository('modules/helma/Http.js') */ @@ -57,6 +57,8 @@ helma.Http = function() { "socket": 0 }; var maxResponseSize = null; + var maxTries = 5; + var currentTries = 0; var responseHandler = function(connection, result) { var input; @@ -86,7 +88,7 @@ helma.Http = function() { try { input.close(); } catch (error) { - // safe to ignore + // safe to ignore } if (binaryMode && (result.code >= 200 && result.code < 300)) { // only honor binaryMode if the request succeeded @@ -174,7 +176,7 @@ helma.Http = function() { * can be either a string or an object. In the latter case all properties * and their values are concatenated into a single string. * If a property is an array, then for each value the propertyname and value pair is added. - * If the name of an array property ends with "_array" then the _array part is removed. + * If the name of an array property ends with "_array" then the _array part is removed. */ this.setContent = function(stringOrObject) { if (stringOrObject != null) { @@ -184,21 +186,21 @@ helma.Http = function() { for (var key in stringOrObject) { value = stringOrObject[key]; if (value instanceof Array) { - if (key.substring(key.length - 6) == "_array") - key = key.substring(0,key.length - 6); + if (key.substring(key.length - 6) == "_array") + key = key.substring(0,key.length - 6); for (var i = 0; i < value.length; i++) { res.write(encodeURIComponent(key)); res.write("="); res.write(encodeURIComponent(value[i])); res.write("&"); - } + } } else { res.write(encodeURIComponent(key)); res.write("="); res.write(encodeURIComponent(value)); res.write("&"); } - } + } content = res.pop(); content = content.substring(0, content.length-1); } else { @@ -209,7 +211,7 @@ helma.Http = function() { } return; }; - + /** * Sets the request method to use. * @param {String} m The method to use (GET, POST ...) @@ -286,7 +288,7 @@ helma.Http = function() { * Adds the cookies passed as argument to the list of cookies to send * to the remote server. * @param {Array} cookies An array containing objects with the properties - * "name" (the name of the cookie) and "value" (the value of the cookie) set. + * "name" (the name of the cookie) and "value" (the value of the cookie) set. */ this.setCookies = function(cookies) { if (cookies != null) { @@ -488,7 +490,7 @@ helma.Http = function() { } else if (!(url instanceof java.net.URL)) { throw new Error("'" + url + "' is not a valid URL."); } - + var conn = proxy ? url.openConnection(proxy) : url.openConnection(); // Note: we must call setInstanceFollowRedirects() instead of // static method setFollowRedirects(), as the latter will @@ -556,6 +558,14 @@ helma.Http = function() { content: null, } + // java.net.URLConnection does not follow redirects from http to https + // See https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4620571 + if (followRedirects && [301, 303].contains(result.code) && result.location) { + currentTries += 1; + if (currentTries >= maxTries) throw new Error('Too many redirects'); + return this.getUrl(result.location, opt); + } + // parse all "Set-Cookie" header fields into an array of // helma.Http.Cookie instances var setCookies = conn.getHeaderFields().get("Set-Cookie"); @@ -654,7 +664,7 @@ helma.Http.setProxy = function(proxyString) { sys.put("http.prodyPort", ""); } return; - + }; @@ -686,7 +696,7 @@ helma.Http.getProxy = function() { * @type Boolean */ helma.Http.isAuthorized = function(name, pwd) { - if (!req.username || !req.password || + if (!req.username || !req.password || req.username != name || req.password != pwd) { res.reset(); res.status = 401;