Author: lindner Date: Thu Oct 15 01:09:03 2009 New Revision: 825363 URL: http://svn.apache.org/viewvc?rev=825363&view=rev Log: SHINDIG-1180 | Patch from Jon Weygandt | makeRequest does not properly handle server errors, plus standardizing error handling
Modified: incubator/shindig/trunk/features/src/main/javascript/features/core.io/io.js incubator/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/jsonrpccontainer.js incubator/shindig/trunk/features/src/test/javascript/features/core.io/iotest.js incubator/shindig/trunk/java/server/src/test/resources/endtoend/makeRequestTest.xml Modified: incubator/shindig/trunk/features/src/main/javascript/features/core.io/io.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/core.io/io.js?rev=825363&r1=825362&r2=825363&view=diff ============================================================================== --- incubator/shindig/trunk/features/src/main/javascript/features/core.io/io.js (original) +++ incubator/shindig/trunk/features/src/main/javascript/features/core.io/io.js Thu Oct 15 01:09:03 2009 @@ -73,9 +73,12 @@ } try { if (xobj.status !== 200) { - // TODO Need to work on standardizing errors + var error = ("" + xobj.status); + if(xobj.responseText) { + error = error + " " + xobj.responseText; + } callback({ - errors : ["Error " + xobj.status], + errors : [error], rc : xobj.status, text : xobj.responseText }); @@ -83,7 +86,7 @@ } } catch(e) { callback({ - errors : ["Error not specified"], + errors : [e.number + " Error not specified"], rc : e.number, text : e.description }); @@ -143,22 +146,27 @@ } function transformResponseData(params, data) { + // Sometimes rc is not present, generally when used + // by jsonrpccontainer, so assume 200 in its absence. var resp = { text: data.body, - rc: data.rc, + rc: data.rc || 200, headers: data.headers, oauthApprovalUrl: data.oauthApprovalUrl, oauthError: data.oauthError, oauthErrorText: data.oauthErrorText, errors: [] }; - if (resp.text) { + if(resp.rc < 200 || resp.rc > 206){ + resp.errors = [resp.rc + " Error"] + } else if (resp.text) { switch (params.CONTENT_TYPE) { case "JSON": case "FEED": resp.data = gadgets.json.parse(resp.text); if (!resp.data) { - resp.errors.push("failed to parse JSON"); + resp.errors.push("500 Failed to parse JSON"); + resp.rc = 500; resp.data = null; } break; @@ -170,7 +178,8 @@ dom.validateOnParse = false; dom.resolveExternals = false; if (!dom.loadXML(resp.text)) { - resp.errors.push("failed to parse XML"); + resp.errors.push("500 Failed to parse XML"); + resp.rc = 500; } else { resp.data = dom; } @@ -178,7 +187,8 @@ var parser = new DOMParser(); dom = parser.parseFromString(resp.text, "text/xml"); if ("parsererror" === dom.documentElement.nodeName) { - resp.errors.push("failed to parse XML"); + resp.errors.push("500 Failed to parse XML"); + resp.rc = 500; } else { resp.data = dom; } @@ -246,7 +256,7 @@ delete gadgets.io.preloaded_[i]; if (preload.rc !== 200) { - callback({errors : ["Error " + preload.rc]}); + callback({rc: preload.rc, errors : [preload.rc + " Error"]}); } else { if (preload.oauthState) { oauthState = preload.oauthState; Modified: incubator/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/jsonrpccontainer.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/jsonrpccontainer.js?rev=825363&r1=825362&r2=825363&view=diff ============================================================================== --- incubator/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/jsonrpccontainer.js (original) +++ incubator/shindig/trunk/features/src/main/javascript/features/opensocial-jsonrpc/jsonrpccontainer.js Thu Oct 15 01:09:03 2009 @@ -69,7 +69,7 @@ }; this.processResponse = function(originalDataRequest, rawJson, error, errorMessage) { - var errorCode = error ? JsonRpcContainer.translateHttpError("Error " + error['code']) : null; + var errorCode = error ? JsonRpcContainer.translateHttpError(error['code']) : null; return new opensocial.ResponseItem(originalDataRequest, error ? null : this.processData(rawJson), errorCode, errorMessage); }; @@ -233,7 +233,7 @@ JsonRpcContainer.generateErrorResponse = function(result, requestObjects, callback) { var globalErrorCode = - JsonRpcContainer.translateHttpError(result.errors[0] + JsonRpcContainer.translateHttpError(result.rc || result.data.error) || opensocial.ResponseItem.Error.INTERNAL_ERROR; @@ -246,19 +246,19 @@ }; JsonRpcContainer.translateHttpError = function(httpError) { - if (httpError === "Error 501") { + if (httpError == 501) { return opensocial.ResponseItem.Error.NOT_IMPLEMENTED; - } else if (httpError === "Error 401") { + } else if (httpError == 401) { return opensocial.ResponseItem.Error.UNAUTHORIZED; - } else if (httpError === "Error 403") { + } else if (httpError == 403) { return opensocial.ResponseItem.Error.FORBIDDEN; - } else if (httpError === "Error 400") { + } else if (httpError == 400) { return opensocial.ResponseItem.Error.BAD_REQUEST; - } else if (httpError === "Error 500") { + } else if (httpError == 500) { return opensocial.ResponseItem.Error.INTERNAL_ERROR; - } else if (httpError === "Error 404") { + } else if (httpError == 404) { return opensocial.ResponseItem.Error.BAD_REQUEST; - } else if (httpError === "Error 417") { + } else if (httpError == 417) { return opensocial.ResponseItem.Error.LIMIT_EXCEEDED; } }; @@ -511,7 +511,7 @@ this.processResponse = function(originalDataRequest, rawJson, error, errorMessage) { var errorCode = error - ? JsonRpcContainer.translateHttpError("Error " + error['code']) + ? JsonRpcContainer.translateHttpError(error['code']) : null; return new opensocial.ResponseItem(originalDataRequest, error ? null : this.processData(rawJson), errorCode, errorMessage); Modified: incubator/shindig/trunk/features/src/test/javascript/features/core.io/iotest.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/test/javascript/features/core.io/iotest.js?rev=825363&r1=825362&r2=825363&view=diff ============================================================================== --- incubator/shindig/trunk/features/src/test/javascript/features/core.io/iotest.js (original) +++ incubator/shindig/trunk/features/src/test/javascript/features/core.io/iotest.js Thu Oct 15 01:09:03 2009 @@ -109,8 +109,8 @@ this.setArg(req, inBody, "httpMethod", "GET"); }; -IoTest.prototype.makeFakeResponse = function(text) { - return new fakeXhr.Response("throw 1; < don't be evil' >" + text, 200); +IoTest.prototype.makeFakeResponse = function(text, rc) { + return new fakeXhr.Response("throw 1; < don't be evil' >" + text, (rc ? rc : 200)); }; IoTest.prototype.testNoMethod = function() { @@ -119,7 +119,7 @@ req.setQueryArg("url", "http://target.example.com/somepage"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -138,7 +138,7 @@ req.setQueryArg("refresh", "1800"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -161,7 +161,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -184,7 +184,7 @@ req.setQueryArg("url", "http://target.example.com/somepage"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); this.fakeXhrs.expect(req, resp); @@ -215,7 +215,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -243,7 +243,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -270,7 +270,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -297,7 +297,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -324,7 +324,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -354,7 +354,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -386,7 +386,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -417,7 +417,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -448,7 +448,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -479,7 +479,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -542,7 +542,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'personal data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -677,7 +677,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'personal data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -709,7 +709,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'personal data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'personal data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -728,6 +728,60 @@ this.assertEquals("personal data", resp.text); }; +IoTest.prototype.testServerFailure = function() { + var req = new fakeXhr.Expectation("GET", "http://example.com/json"); + this.setStandardArgs(req, false); + req.setQueryArg("url", "http://target.example.com/somepage"); + req.setQueryArg("contentType", "JSON"); + + var resp = this.makeFakeResponse(gadgets.json.stringify( + { 'http://target.example.com/somepage' : { + 'body' : 'Internal Server Failure.', + 'rc' : 500 + } + })); + + this.fakeXhrs.expect(req, resp); + + var resp = null; + gadgets.io.makeRequest("http://target.example.com/somepage", + function(data) { + resp = data; + }, + { + "CONTENT_TYPE" : "JSON", + }); + this.assertEquals(500, resp.rc); + this.assertEquals(gadgets.json.stringify(["500 Error"]), gadgets.json.stringify(resp.errors)); + this.assertEquals("Internal Server Failure.", resp.text); +}; + +IoTest.prototype.testJsonNonAuthoritative = function() { + var req = new fakeXhr.Expectation("GET", "http://example.com/json"); + this.setStandardArgs(req, false); + req.setQueryArg("url", "http://target.example.com/somepage"); + req.setQueryArg("contentType", "JSON"); + + var resp = this.makeFakeResponse(gadgets.json.stringify( + { 'http://target.example.com/somepage' : { + 'body' : '{ "somejsonparam" : 3 }', + 'rc' : 203 + } + })); + + this.fakeXhrs.expect(req, resp); + + var resp = null; + gadgets.io.makeRequest("http://target.example.com/somepage", + function(data) { + resp = data; + }, + { + "CONTENT_TYPE" : "JSON", + }); + this.assertEquals(3, resp.data.somejsonparam); +}; + IoTest.prototype.testJson = function() { var req = new fakeXhr.Expectation("GET", "http://example.com/json"); this.setStandardArgs(req, false); @@ -737,6 +791,7 @@ var resp = this.makeFakeResponse(gadgets.json.stringify( { 'http://target.example.com/somepage' : { 'body' : '{ "somejsonparam" : 3 }', + 'rc' : 200 } })); @@ -762,6 +817,7 @@ var resp = this.makeFakeResponse(gadgets.json.stringify( { 'http://target.example.com/somepage' : { 'body' : '{ bogus : 3 }', + 'rc' : 200 } })); @@ -775,7 +831,7 @@ { "CONTENT_TYPE" : "JSON", }); - this.assertEquals("failed to parse JSON", resp.errors[0]); + this.assertEquals("500 Failed to parse JSON", resp.errors[0]); }; IoTest.prototype.testPreload = function() { @@ -809,6 +865,7 @@ var resp = this.makeFakeResponse(gadgets.json.stringify( { 'http://target.example.com/somepage' : { 'body' : 'not preloaded', + 'rc' : 200 } })); @@ -841,7 +898,7 @@ req.setHeader("Content-Type", "application/x-www-form-urlencoded"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -872,7 +929,7 @@ req.setQueryArg("url", "http://target.example.com/somepage"); var resp = this.makeFakeResponse( - "{ 'http://target.example.com/somepage' : { 'body' : 'some data' }}"); + "{ 'http://target.example.com/somepage' : { 'body' : 'some data', 'rc' : 200 }}"); this.fakeXhrs.expect(req, resp); @@ -901,7 +958,8 @@ var resp = this.makeFakeResponse(gadgets.json.stringify( { 'http://target.example.com/somepage' : { - 'body' : 'not preloaded', + 'body' : 'not preloaded', + 'rc' : 200 } })); @@ -912,7 +970,7 @@ function(data) { resp = data; }); - this.assertEquals("Error 404", resp.errors[0]); + this.assertEquals("404 Error", resp.errors[0]); var resp = null; gadgets.io.makeRequest("http://target.example.com/somepage", @@ -944,7 +1002,8 @@ var resp = this.makeFakeResponse(gadgets.json.stringify( { 'http://target.example.com/somepage' : { - 'body' : 'not preloaded', + 'body' : 'not preloaded', + 'rc' : 200 } } )); Modified: incubator/shindig/trunk/java/server/src/test/resources/endtoend/makeRequestTest.xml URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/test/resources/endtoend/makeRequestTest.xml?rev=825363&r1=825362&r2=825363&view=diff ============================================================================== --- incubator/shindig/trunk/java/server/src/test/resources/endtoend/makeRequestTest.xml (original) +++ incubator/shindig/trunk/java/server/src/test/resources/endtoend/makeRequestTest.xml Thu Oct 15 01:09:03 2009 @@ -55,7 +55,7 @@ fetchMakeRequestJson: function() { function receivedData(response) { assertEquals('Response code not set', 404, response.rc); - assertEquals('Errors not an empty array', 0, response.errors.length); + assertEquals('Errors not an empty array', 1, response.errors.length); finished(); }