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();
             }