You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by li...@apache.org on 2009/10/15 03:09:03 UTC
svn commit: r825363 - in /incubator/shindig/trunk:
features/src/main/javascript/features/core.io/
features/src/main/javascript/features/opensocial-jsonrpc/
features/src/test/javascript/features/core.io/
java/server/src/test/resources/endtoend/
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();
}