1 16 package com.google.gwt.http.client; 17 18 import com.google.gwt.core.client.GWT; 19 import com.google.gwt.core.client.JavaScriptObject; 20 import com.google.gwt.core.client.GWT.UncaughtExceptionHandler; 21 import com.google.gwt.user.client.Timer; 22 23 34 public class Request { 35 42 private static Response createResponse(final JavaScriptObject xmlHttpRequest) { 43 assert (XMLHTTPRequest.isResponseReady(xmlHttpRequest)); 44 Response response = new Response() { 45 public String getHeader(String header) { 46 StringValidator.throwIfEmptyOrNull("header", header); 47 48 return XMLHTTPRequest.getResponseHeader(xmlHttpRequest, header); 49 } 50 51 public Header[] getHeaders() { 52 return XMLHTTPRequest.getHeaders(xmlHttpRequest); 53 } 54 55 public String getHeadersAsString() { 56 return XMLHTTPRequest.getAllResponseHeaders(xmlHttpRequest); 57 } 58 59 public int getStatusCode() { 60 return XMLHTTPRequest.getStatusCode(xmlHttpRequest); 61 } 62 63 public String getStatusText() { 64 return XMLHTTPRequest.getStatusText(xmlHttpRequest); 65 } 66 67 public String getText() { 68 return XMLHTTPRequest.getResponseText(xmlHttpRequest); 69 } 70 }; 71 return response; 72 } 73 74 77 private final int timeoutMillis; 78 79 83 private final Timer timer; 84 85 90 private JavaScriptObject xmlHttpRequest; 91 92 102 Request(JavaScriptObject xmlHttpRequest, int timeoutMillis, 103 final RequestCallback callback) { 104 if (xmlHttpRequest == null) { 105 throw new NullPointerException (); 106 } 107 108 if (callback == null) { 109 throw new NullPointerException (); 110 } 111 112 if (timeoutMillis < 0) { 113 throw new IllegalArgumentException (); 114 } 115 116 this.timeoutMillis = timeoutMillis; 117 118 this.xmlHttpRequest = xmlHttpRequest; 119 120 if (timeoutMillis > 0) { 121 timer = new Timer() { 123 public void run() { 124 fireOnTimeout(callback); 125 } 126 }; 127 128 timer.schedule(timeoutMillis); 129 } else { 130 timer = null; 132 } 133 } 134 135 139 public void cancel() { 140 152 if (xmlHttpRequest != null) { 153 JavaScriptObject xmlHttp = xmlHttpRequest; 154 xmlHttpRequest = null; 155 156 XMLHTTPRequest.abort(xmlHttp); 157 158 cancelTimer(); 159 } 160 } 161 162 167 public boolean isPending() { 168 if (xmlHttpRequest == null) { 169 return false; 170 } 171 172 int readyState = XMLHTTPRequest.getReadyState(xmlHttpRequest); 173 174 181 switch (readyState) { 182 case XMLHTTPRequest.OPEN: 183 case XMLHTTPRequest.SENT: 184 case XMLHTTPRequest.RECEIVING: 185 return true; 186 } 187 188 return false; 189 } 190 191 194 private void cancelTimer() { 195 if (timer != null) { 196 timer.cancel(); 197 } 198 } 199 200 206 private void fireOnResponseReceived(RequestCallback callback) { 207 UncaughtExceptionHandler handler = GWT.getUncaughtExceptionHandler(); 208 if (handler != null) { 209 fireOnResponseReceivedAndCatch(handler, callback); 210 } else { 211 fireOnResponseReceivedImpl(callback); 212 } 213 } 214 215 private void fireOnResponseReceivedAndCatch(UncaughtExceptionHandler handler, 216 RequestCallback callback) { 217 try { 218 fireOnResponseReceivedImpl(callback); 219 } catch (Throwable e) { 220 handler.onUncaughtException(e); 221 } 222 } 223 224 private void fireOnResponseReceivedImpl(RequestCallback callback) { 225 if (xmlHttpRequest == null) { 226 return; 228 } 229 230 cancelTimer(); 231 232 237 final JavaScriptObject xmlHttp = xmlHttpRequest; 238 xmlHttpRequest = null; 239 240 String errorMsg = XMLHTTPRequest.getBrowserSpecificFailure(xmlHttp); 241 if (errorMsg != null) { 242 Throwable exception = new RuntimeException (errorMsg); 243 callback.onError(this, exception); 244 } else { 245 Response response = createResponse(xmlHttp); 246 callback.onResponseReceived(this, response); 247 } 248 } 249 250 255 private final void fireOnTimeout(RequestCallback callback) { 256 if (xmlHttpRequest == null) { 257 return; 259 } 260 261 cancel(); 262 263 callback.onError(this, new RequestTimeoutException(this, timeoutMillis)); 264 } 265 } 266 | Popular Tags |