From 80c15de606402c5b56ab1a901c6609ffae9c6337 Mon Sep 17 00:00:00 2001 From: Bryce Curtis Date: Mon, 1 Nov 2010 13:59:08 -0500 Subject: [PATCH] Return error conditions from CallbackServer instead of just closing connection. --- framework/assets/js/phonegap.js.base | 30 +++++++++++++++++-- .../src/com/phonegap/CallbackServer.java | 16 ++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/framework/assets/js/phonegap.js.base b/framework/assets/js/phonegap.js.base index b3446986..229b7fff 100755 --- a/framework/assets/js/phonegap.js.base +++ b/framework/assets/js/phonegap.js.base @@ -578,8 +578,8 @@ PhoneGap.run_command = function() { }; -PhoneGap.JSCallbackPort = CallbackServer.getPort(); -PhoneGap.JSCallbackToken = CallbackServer.getToken(); +PhoneGap.JSCallbackPort = null; +PhoneGap.JSCallbackToken = null; /** * This is only for Android. @@ -605,7 +605,7 @@ PhoneGap.JSCallback = function() { } catch (e) { // If we're getting an error here, seeing the message will help in debugging - console.log("Message from Server: " + msg); + console.log("JSCallback: Message from Server: " + msg); console.log("JSCallback Error: "+e); } }, 1); @@ -617,15 +617,38 @@ PhoneGap.JSCallback = function() { setTimeout(PhoneGap.JSCallback, 10); } + // If security error + else if (xmlhttp.status == 403) { + console.log("JSCallback Error: Invalid token. Stopping callbacks."); + } + + // If server is stopping + else if (xmlhttp.status == 503) { + console.log("JSCallback Error: Service unavailable. Stopping callbacks."); + } + + // If request wasn't GET + else if (xmlhttp.status == 400) { + console.log("JSCallback Error: Bad request. Stopping callbacks."); + } + // If error, restart callback server else { console.log("JSCallback Error: Request failed."); CallbackServer.restartServer(); + PhoneGap.JSCallbackPort = null; + PhoneGap.JSCallbackToken = null; setTimeout(PhoneGap.JSCallback, 100); } } } + if (PhoneGap.JSCallbackPort == null) { + PhoneGap.JSCallbackPort = CallbackServer.getPort(); + } + if (PhoneGap.JSCallbackToken == null) { + PhoneGap.JSCallbackToken = CallbackServer.getToken(); + } xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true); xmlhttp.send(); }; @@ -651,6 +674,7 @@ PhoneGap.JSCallbackPolling = function() { var t = eval(""+msg); } catch (e) { + console.log("JSCallbackPolling: Message from Server: " + msg); console.log("JSCallbackPolling Error: "+e); } }, 1); diff --git a/framework/src/com/phonegap/CallbackServer.java b/framework/src/com/phonegap/CallbackServer.java index 362cf6e9..30034cf7 100755 --- a/framework/src/com/phonegap/CallbackServer.java +++ b/framework/src/com/phonegap/CallbackServer.java @@ -168,6 +168,7 @@ public class CallbackServer implements Runnable { BufferedReader xhrReader = new BufferedReader(new InputStreamReader(connection.getInputStream()),40); DataOutputStream output = new DataOutputStream(connection.getOutputStream()); request = xhrReader.readLine(); + String response = ""; //System.out.println("Request="+request); if (request.contains("GET")) { @@ -194,16 +195,27 @@ public class CallbackServer implements Runnable { // If no data, then send 404 back to client before it times out if (this.empty) { //System.out.println(" -- sending data 0"); - output.writeBytes("HTTP/1.1 404 NO DATA\r\n\r\n"); + response = "HTTP/1.1 404 NO DATA\r\n\r\n"; } else { //System.out.println(" -- sending item"); - output.writeBytes("HTTP/1.1 200 OK\r\n\r\n"+this.getJavascript()); + response = "HTTP/1.1 200 OK\r\n\r\n"+this.getJavascript(); } } + else { + response = "HTTP/1.1 503 Service Unavailable\r\n\r\n"; + } + } + else { + response = "HTTP/1.1 403 Forbidden\r\n\r\n"; } } + else { + response = "HTTP/1.1 400 Bad Request\r\n\r\n"; + } + //System.out.println("CallbackServer: response="+response); //System.out.println("CallbackServer: closing output"); + output.writeBytes(response); output.close(); } } catch (IOException e) {