/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.gears.client.httprequest;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.gears.client.blob.Blob;
/**
* The HttpRequest API implements a subset of the W3C XmlHttpRequest
* specification, and makes it available in both workers and the main HTML page.
*/
public final class HttpRequest extends JavaScriptObject {
// Called from JSNI
@SuppressWarnings("unused")
private static void fireOnProgress(ProgressHandler handler,
ProgressEvent event) {
if (handler == null) {
return;
}
UncaughtExceptionHandler ueh = GWT.getUncaughtExceptionHandler();
if (ueh != null) {
try {
handler.onProgress(event);
} catch (Throwable e) {
ueh.onUncaughtException(e);
}
} else {
handler.onProgress(event);
}
}
/*
* Method called when the JavaScript XmlHttpRequest object's readyState
* reaches 4 (LOADED).
*
* NOTE: this method is called from JSNI
*/
@SuppressWarnings("unused")
private static void fireRequestComplete(RequestCallback handler,
HttpRequest request) {
if (handler == null) {
return;
}
UncaughtExceptionHandler ueh = GWT.getUncaughtExceptionHandler();
if (ueh != null) {
try {
handler.onResponseReceived(request);
} catch (Throwable e) {
ueh.onUncaughtException(e);
}
} else {
handler.onResponseReceived(request);
}
}
protected HttpRequest() {
// Required for overlay types
}
/**
* Cancels the request.
*/
public native void abort()/*-{
this.abort();
}-*/;
/**
* Returns a string containing the entire set of HTTP headers in the server
* response.
*
* @return a string containing the entire set of HTTP headers in the server
* response.
*/
public native String getAllResponseHeaders()/*-{
return this.getAllResponseHeaders();
}-*/;;
/**
* Returns the state of the request.
* <table>
* <tr>
* <td>0</td>
* <td>Uninitialized</td>
* </tr>
* <tr>
* <td>1</td>
* <td>Open</td>
* </tr>
* <tr>
* <td>2</td>
* <td>Sent</td>
* </tr>
* <tr>
* <td>3</td>
* <td>Interactive</td>
* </tr>
* <tr>
* <td>4</td>
* <td>Complete</td>
* </tr>
* </table>
*
* @return the state of the request
*/
public native int getReadyState()/*-{
return this.readyState;
}-*/;
/**
* Returns the response body as a {@link Blob}. This property can be read when
* the request is in the Complete state.
*
* @return the response body as a {@link Blob}
*/
public native Blob getResponseBlob()/*-{
return this.responseBlob;
}-*/;;
/**
* Returns the value of a specific HTTP header in the server response.
*
* @param name the name of the header value to return
* @return the value of the header
*/
public native String getResponseHeader(String name)/*-{
return this.getResponseHeader(name);
}-*/;;
/**
* Returns the response body as a string. This property can be read when the
* request is in the Interactive or Complete state.
*
* @return the response body as a string
*/
public native String getResponseText()/*-{
return this.responseText;
}-*/;
/**
* Returns the status as a number (e.g. 404 for "Not Found" or 200 for "OK").
* This property can be read when the request is in the Interactive or
* Complete state.
*
* @return the status as a number
*/
public native int getStatus()/*-{
return this.status;
}-*/;
/**
* Returns the status as a string (e.g. "Not Found" or "OK"). This property
* can be read when the request is in the Interactive or Complete state.
*
* @return the status as a string
*/
public native String getStatusText()/*-{
return this.statusText;
}-*/;
/**
* Returns an {@link HttpRequestUpload} object for accessing properties
* associated with POST or PUT data uploads.
*
* @return an {@link HttpRequestUpload} object for accessing properties
* associated with POST or PUT data uploads.
*/
public native HttpRequestUpload getUpload()/*-{
return this.upload;
}-*/;
/**
* Specifies the method and URL of a request.
*
* @param method a value of "GET", "POST", "HEAD" or another HTTP method
* listed in the W3C specification
* @param url either a relative or complete URL which must be from the same
* origin as the current context
*/
public native void open(String method, String url)/*-{
this.open(method, url);
}-*/;
/**
* Sends the request.
*/
public native void send()/*-{
this.send(callback);
}-*/;
/**
* Sends the request.
*
* @param postData {@link Blob} to be sent as the body of a POST or PUT
* request
*/
public native void send(Blob postData)/*-{
this.send(postData);
}-*/;
/**
* Sends the request.
*
* @param postData {@link Blob} to be sent as the body of a POST or PUT
* request
* @param callback an event handler that fires as response data is downloaded.
*/
public void send(Blob postData, RequestCallback callback) {
setCallback(callback);
send(postData);
}
/**
* Sends the request.
*
* @param callback an event handler that fires as response data is downloaded.
*/
public void send(RequestCallback callback) {
setCallback(callback);
send();
}
/**
* Sends the request.
*
* @param postData String to be sent as the body of a POST or PUT request
*/
public native void send(String postData)/*-{
this.send(postData);
}-*/;
/**
* Sends the request.
*
* @param postData String to be sent as the body of a POST or PUT request
* @param callback an event handler that fires as response data is downloaded.
*/
public void send(String postData, RequestCallback callback) {
setCallback(callback);
send(postData);
}
/**
* Sets an event handler that fires as response data is downloaded.
*
* @param handler an event handler that fires as response data is downloaded.
*/
public native void setCallback(RequestCallback handler) /*-{
var request = this;
this.onreadystatechange = function() {
if (request.readyState == 4) {
@com.google.gwt.gears.client.httprequest.HttpRequest::fireRequestComplete(Lcom/google/gwt/gears/client/httprequest/RequestCallback;Lcom/google/gwt/gears/client/httprequest/HttpRequest;)(handler, request);
request.onreadystatechange = null;
request.onprogress = null;
request.upload.onprogress = null;
}
};
}-*/;
/**
* Sets an event handler that fires as response data is downloaded.
*
* @param handler an event handler that fires as response data is downloaded.
*/
public native void setProgressHandler(ProgressHandler handler) /*-{
this.onprogress = function(progressEvent) {
@com.google.gwt.gears.client.httprequest.HttpRequest::fireOnProgress(Lcom/google/gwt/gears/client/httprequest/ProgressHandler;Lcom/google/gwt/gears/client/httprequest/ProgressEvent;)(handler, progressEvent);
};
}-*/;
/**
* Adds the header to the set of HTTP headers to be sent.
*
* @param name the HTTP header to set
* @param value the value of the header
*/
public native void setRequestHeader(String name, String value)/*-{
this.setRequestHeader(name, value);
}-*/;
}