blob: 00b91f88ea3249926d7f54ec1e24027276fc2263 [file] [log] [blame]
package autotest.common;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONException;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
/**
* JsonRpcProxy that uses XmlHttpRequests to make requests to the server. This is the standard
* technique for AJAX and suffers from the usual restrictions -- Same-Origin Policy and a maximum of
* two simultaneous outstanding requests.
*/
class XhrJsonRpcProxy extends JsonRpcProxy {
protected RequestBuilder requestBuilder;
public XhrJsonRpcProxy(String url) {
requestBuilder = new RequestBuilder(RequestBuilder.POST, url);
}
@Override
protected void sendRequest(JSONObject request, final JsonRpcCallback callback) {
try {
requestBuilder.sendRequest(request.toString(), new RpcHandler(callback));
}
catch (RequestException e) {
notify.showError("Unable to connect to server");
callback.onError(null);
return;
}
notify.setLoading(true);
}
private static class RpcHandler implements RequestCallback {
private JsonRpcCallback callback;
public RpcHandler(JsonRpcCallback callback) {
this.callback = callback;
}
public void onError(Request request, Throwable exception) {
notify.setLoading(false);
notify.showError("Unable to make RPC call", exception.toString());
callback.onError(null);
}
public void onResponseReceived(Request request, Response response) {
notify.setLoading(false);
String responseText = response.getText();
int statusCode = response.getStatusCode();
if (statusCode != 200) {
notify.showError("Received error " + Integer.toString(statusCode) + " " +
response.getStatusText(),
response.getHeadersAsString() + "\n\n" + responseText);
callback.onError(null);
return;
}
handleResponseText(responseText, callback);
}
}
private static void handleResponseText(String responseText, JsonRpcCallback callback) {
JSONValue responseValue = null;
try {
responseValue = JSONParser.parse(responseText);
}
catch (JSONException exc) {
JsonRpcProxy.notify.showError(exc.toString(), responseText);
callback.onError(null);
return;
}
JSONObject responseObject = responseValue.isObject();
handleResponseObject(responseObject, callback);
}
}