You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AjaxTransportJre.java 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package com.google.gwt.query.vm;
  2. // import org.apache.http.impl.client.HttpClientBuilder;
  3. import java.io.BufferedReader;
  4. import java.io.DataOutputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import com.google.gwt.http.client.RequestException;
  9. import com.google.gwt.http.client.Response;
  10. import com.google.gwt.query.client.Binder;
  11. import com.google.gwt.query.client.Function;
  12. import com.google.gwt.query.client.GQ;
  13. import com.google.gwt.query.client.GQuery;
  14. import com.google.gwt.query.client.Promise;
  15. import com.google.gwt.query.client.plugins.ajax.Ajax.AjaxTransport;
  16. import com.google.gwt.query.client.plugins.ajax.Ajax.Settings;
  17. import com.google.gwt.query.client.plugins.deferred.PromiseFunction;
  18. import com.google.gwt.user.server.Base64Utils;
  19. /**
  20. *
  21. */
  22. public class AjaxTransportJre implements AjaxTransport {
  23. private static String localDomain = null;
  24. private static CookieManager cookieManager = CookieManager.getInstance();
  25. public static void enableCORS(String domain) {
  26. localDomain = domain;
  27. System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
  28. }
  29. private final String USER_AGENT = "Mozilla/5.0";
  30. private final String jsonpCbRexp = "(?ms)^.*jre_callback\\((.*)\\).*$";
  31. public Promise getJsonP(final Settings settings) {
  32. String url = settings.getUrl().replaceFirst("callback=[^&]*", "");
  33. url += (url.contains("?") ? "&" : "?") + "callback=jre_callback";
  34. settings.setUrl(url);
  35. if (settings.getTimeout() < 1) {
  36. settings.setTimeout(10000);
  37. }
  38. return getXhr(settings, false)
  39. .then(new Function() {
  40. public Object f(Object... args) {
  41. Response response = arguments(0);
  42. if (response.getText().matches(jsonpCbRexp)) {
  43. return GQ.create(response.getText().replaceFirst(jsonpCbRexp, "$1"));
  44. } else {
  45. return GQuery.Deferred().reject().promise();
  46. }
  47. }
  48. });
  49. }
  50. public Promise getLoadScript(Settings settings) {
  51. return getXhr(settings, false);
  52. }
  53. public Promise getXhr(final Settings settings) {
  54. return getXhr(settings, true);
  55. }
  56. private Promise getXhr(final Settings settings, final boolean cors) {
  57. return new PromiseFunction() {
  58. public void f(Deferred dfd) {
  59. try {
  60. Response response = httpClient(settings, cors);
  61. int status = response.getStatusCode();
  62. if (status <= 0 || status >= 400) {
  63. String statusText = status <= 0 ? "Bad CORS" : response.getStatusText();
  64. dfd.reject(null, new RequestException("HTTP ERROR: " + status + " " + statusText + "\n" + response.getText()));
  65. } else {
  66. dfd.resolve(response, null);
  67. }
  68. } catch (Exception e) {
  69. dfd.reject(e, null);
  70. }
  71. }
  72. };
  73. }
  74. private Response httpClient(Settings s, boolean cors) throws Exception {
  75. String url = s.getUrl();
  76. assert url.toLowerCase().startsWith("http");
  77. URL u = new URL(url);
  78. HttpURLConnection c = (HttpURLConnection) u.openConnection();
  79. c.setRequestMethod(s.getType());
  80. c.setRequestProperty("User-Agent", USER_AGENT);
  81. if (s.getUsername() != null && s.getPassword() != null) {
  82. c.setRequestProperty ("Authorization", "Basic " + Base64Utils.toBase64((s.getUsername() + ":" + s.getPassword()).getBytes()));
  83. }
  84. cookieManager.setCookies(c);
  85. boolean isCORS = cors && localDomain != null && !s.getUrl().contains(localDomain);
  86. if (isCORS) {
  87. // TODO: fetch options previously to the request
  88. // >> OPTIONS
  89. // Origin: http://127.0.0.1:8888
  90. // Access-Control-Allow-Origin: http://127.0.0.1:8888
  91. // Access-Control-Allow-Credentials: true
  92. // Access-Control-Request-Headers: content-type
  93. // Access-Control-Allow-Headers
  94. // Access-Control-Request-Method
  95. // Access-Control-Allow-Methods: POST, GET
  96. // Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS
  97. // >> POST/GET
  98. // Origin: http://127.0.0.1:8888
  99. // Access-Control-Allow-Origin: http://127.0.0.1:8888
  100. // Access-Control-Allow-Credentials: true
  101. c.setRequestProperty("Origin", localDomain);
  102. }
  103. if (s.getTimeout() > 0) {
  104. c.setConnectTimeout(s.getTimeout());
  105. c.setReadTimeout(s.getTimeout());
  106. }
  107. Binder headers = s.getHeaders();
  108. if (headers != null) {
  109. for (String h : headers.getFieldNames()) {
  110. c.setRequestProperty(h, "" + headers.get(h));
  111. }
  112. }
  113. if (s.getType().matches("POST|PUT")) {
  114. c.setRequestProperty("Content-Type", s.getContentType());
  115. c.setDoOutput(true);
  116. DataOutputStream wr = new DataOutputStream(c.getOutputStream());
  117. wr.writeBytes(s.getDataString());
  118. wr.flush();
  119. wr.close();
  120. }
  121. int code = c.getResponseCode();
  122. if (isCORS && !localDomain.equals(c.getHeaderField("Access-Control-Allow-Origin"))) {
  123. code = 0;
  124. }
  125. BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
  126. String inputLine;
  127. StringBuffer response = new StringBuffer();
  128. while ((inputLine = in.readLine()) != null) {
  129. response.append(inputLine + "\n");
  130. }
  131. in.close();
  132. cookieManager.storeCookies(c);
  133. return new ResponseJre(code, c.getResponseMessage(), response.toString(), c.getHeaderFields());
  134. }
  135. }