Revision: 9473
http://languagetool.svn.sourceforge.net/languagetool/?rev=9473&view=rev
Author: dnaber
Date: 2013-02-23 20:39:27 +0000 (Sat, 23 Feb 2013)
Log Message:
-----------
stop using the proxy but use CORS - requires the server to send
"Access-Control-Allow-Origin: *" as a http header - according to the docs at
Mozilla, this should work with all modern browsers + MSIE 8 and up
Modified Paths:
--------------
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPSServer.java
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServer.java
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
trunk/website/include/header.php
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/editor_plugin.js
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/src/editor_plugin.js
Modified:
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPSServer.java
===================================================================
---
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPSServer.java
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPSServer.java
2013-02-23 20:39:27 UTC (rev 9473)
@@ -69,6 +69,7 @@
final RequestLimiter limiter = getRequestLimiterOrNull(config);
final LanguageToolHttpHandler httpHandler = new
LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally, limiter);
httpHandler.setMaxTextLength(config.getMaxTextLength());
+ httpHandler.setAllowOriginUrl(config.getAllowOriginUrl());
server.createContext("/", httpHandler);
} catch (BindException e) {
final ResourceBundle messages = JLanguageTool.getMessageBundle();
Modified:
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServer.java
===================================================================
---
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServer.java
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServer.java
2013-02-23 20:39:27 UTC (rev 9473)
@@ -95,7 +95,9 @@
} else {
server = HttpServer.create(new InetSocketAddress(host, port), 0);
}
- server.createContext("/", new
LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally, null));
+ final LanguageToolHttpHandler httpHandler = new
LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally, null);
+ httpHandler.setAllowOriginUrl(config.getAllowOriginUrl());
+ server.createContext("/", httpHandler);
} catch (Exception e) {
final ResourceBundle messages = JLanguageTool.getMessageBundle();
final String message = Tools.makeTexti18n(messages,
"http_server_start_failed", host, Integer.toString(port));
Modified:
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java
===================================================================
---
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java
2013-02-23 20:39:27 UTC (rev 9473)
@@ -31,6 +31,7 @@
protected boolean verbose = false;
protected boolean publicAccess = false;
protected int port = DEFAULT_PORT;
+ protected String allowOriginUrl = null;
public HTTPServerConfig() {
this.port = DEFAULT_PORT;
@@ -59,6 +60,8 @@
verbose = true;
} else if ("--public".equals(args[i])) {
publicAccess = true;
+ } else if ("--allow-origin".equals(args[i])) {
+ allowOriginUrl = args[++i];
}
}
}
@@ -78,4 +81,11 @@
return port;
}
+ /**
+ * URL of server whose visitors may request data via Ajax, or {@code *} (=
anyone) or {@code null} (= no support for CORS).
+ */
+ public String getAllowOriginUrl() {
+ return allowOriginUrl;
+ }
+
}
Modified:
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
===================================================================
---
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/languagetool/languagetool-server/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
2013-02-23 20:39:27 UTC (rev 9473)
@@ -56,6 +56,7 @@
private String[] enabledRules = {};
private String[] disabledRules = {};
private int maxTextLength = Integer.MAX_VALUE;
+ private String allowOriginUrl;
/**
* @param verbose print the input text in case of exceptions
@@ -74,6 +75,15 @@
this.maxTextLength = maxTextLength;
}
+ /**
+ * Value to set as the "Access-Control-Allow-Origin" http header. Use {@code
null}
+ * to not return that header at all. Use {@code *} to run a server that any
other web site
+ * can use from Javascript/Ajax (search Cross-origin resource sharing (CORS)
for details).
+ */
+ void setAllowOriginUrl(String allowOriginUrl) {
+ this.allowOriginUrl = allowOriginUrl;
+ }
+
@Override
public void handle(HttpExchange httpExchange) throws IOException {
String text = null;
@@ -133,12 +143,19 @@
}
private void printListOfLanguages(HttpExchange httpExchange) throws
IOException {
- httpExchange.getResponseHeaders().set("Content-Type", CONTENT_TYPE_VALUE);
+ setCommonHeaders(httpExchange);
final String response = getSupportedLanguagesAsXML();
httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK,
response.getBytes(ENCODING).length);
httpExchange.getResponseBody().write(response.getBytes(ENCODING));
}
-
+
+ private void setCommonHeaders(HttpExchange httpExchange) {
+ httpExchange.getResponseHeaders().set("Content-Type", CONTENT_TYPE_VALUE);
+ if (allowOriginUrl != null) {
+ httpExchange.getResponseHeaders().set("Access-Control-Allow-Origin",
allowOriginUrl);
+ }
+ }
+
private static Language detectLanguageOfString(final String text, final
String fallbackLanguage) {
// TODO: use identifier.isReasonablyCertain() - but make sure it works!
if (text.length() < MIN_LENGTH_FOR_AUTO_DETECTION && fallbackLanguage !=
null) {
@@ -216,7 +233,7 @@
final List<BitextRule> bRules = Tools.getBitextRules(motherTongue, lang);
matches = Tools.checkBitext(sourceText, text, sourceLt, targetLt,
bRules);
}
- httpExchange.getResponseHeaders().set("Content-Type", CONTENT_TYPE_VALUE);
+ setCommonHeaders(httpExchange);
final String response = StringTools.ruleMatchesToXML(matches, text,
CONTEXT_SIZE, StringTools.XmlPrintMode.NORMAL_XML, lang,
motherTongue);
httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK,
response.getBytes(ENCODING).length);
Modified: trunk/website/include/header.php
===================================================================
--- trunk/website/include/header.php 2013-02-23 14:38:12 UTC (rev 9472)
+++ trunk/website/include/header.php 2013-02-23 20:39:27 UTC (rev 9473)
@@ -109,8 +109,10 @@
},
languagetool_i18n_current_lang : function() { return
document.checkform.lang.value; },
- /* the URL of your proxy file: */
- languagetool_rpc_url : "<?php print $rootUrl
?>/online-check/tiny_mce/plugins/atd-tinymce/server/proxy.php?url=",
+ /* The URL of your proxy file or the LT server if you're using CORS,
i.e. started the server with '--allow-origin "*"'
+ * (see
https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control):
+ */
+ languagetool_rpc_url :
"https://languagetool.org:8081",
/* edit this file to customize how LanguageTool shows errors: */
languagetool_css_url : "<?php print $rootUrl
?>/online-check/tiny_mce/plugins/atd-tinymce/css/content.css",
/* this stuff is a matter of preference: */
Modified:
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/editor_plugin.js
===================================================================
---
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/editor_plugin.js
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/editor_plugin.js
2013-02-23 20:39:27 UTC (rev 9473)
@@ -447,26 +447,26 @@
/* send request to our service */
var textContent = plugin.editor.core.getPlainText();
- plugin.sendRequest('checkDocument', textContent, languageCode,
function(data, request, someObject)
+ plugin.sendRequest('', textContent, languageCode, function(data,
request, jqXHR)
{
/* turn off the spinning thingie */
plugin.editor.setProgressState(0);
/* if the server is not accepting requests, let the user know */
- if (request.status != 200 || request.responseText.substr(1, 4)
== 'html' || request.responseText == '')
+ if (jqXHR.status != 200 || jqXHR.responseText.substr(1, 4) ==
'html' || jqXHR.responseText == '')
{
ed.windowManager.alert(
plugin.editor.getLang('AtD.message_server_error', 'There was a problem
communicating with the service. Try again in one minute.') );
return;
}
/* check to see if things are broken first and foremost */
- if (request.responseXML.getElementsByTagName('message').item(0)
!= null)
+ if (jqXHR.responseXML.getElementsByTagName('message').item(0)
!= null)
{
-
ed.windowManager.alert(request.responseXML.getElementsByTagName('message').item(0).firstChild.data);
+
ed.windowManager.alert(jqXHR.responseXML.getElementsByTagName('message').item(0).firstChild.data);
return;
}
- var results = core.processXML(request.responseXML);
+ var results = core.processXML(jqXHR.responseXML);
if (results.length == 0) {
var lang =
plugin.editor.getParam('languagetool_i18n_current_lang')();
@@ -493,7 +493,7 @@
/* again showing a menu, I have no clue what */
editor.onClick.add(plugin._showMenu, plugin);
- /* comment this in and comment out the list below to get the
browser's standard context menu on right click: */
+ /* comment this in and comment out the line below to get the
browser's standard context menu on right click: */
//editor.onContextMenu.add(plugin._showMenu, plugin);
// without this, the context menu opens but nothing in it can be
selected:
editor.onContextMenu.add(plugin._doNotShowMenu, plugin);
@@ -755,7 +755,20 @@
alert('Please specify: languagetool_rpc_url');
return;
}
+
+ jQuery.ajax({
+ url: url + "/" + file,
+ type: "POST",
+ data: "text=" + encodeURI(data).replace(/&/g, '%26') +
"&language=" + encodeURI(languageCode),
+ success: success,
+ error: function(type, req, o) {
+ plugin.editor.setProgressState(0);
+ alert("Could not send request to\n" + o.url + "\nError: " +
type + "\nStatus code: " + req.status + "\nPlease make sure your network
connection works.");
+ }
+ });
+ /* this causes an OPTIONS request to be send as a preflight - LT
server doesn't support that,
+ thus we're using jQuery.ajax() instead
tinymce.util.XHR.send({
url : url + "/" + file,
content_type : 'text/xml',
@@ -769,7 +782,7 @@
plugin.editor.setProgressState(0);
alert("Could not send request to\n" + o.url + "\nError: " +
type + "\nStatus code: " + req.status + "\nPlease make sure your network
connection works.");
}
- });
+ });*/
}
});
Modified:
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/src/editor_plugin.js
===================================================================
---
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/src/editor_plugin.js
2013-02-23 14:38:12 UTC (rev 9472)
+++
trunk/website/www/online-check/tiny_mce/plugins/atd-tinymce/src/editor_plugin.js
2013-02-23 20:39:27 UTC (rev 9473)
@@ -127,26 +127,26 @@
/* send request to our service */
var textContent = plugin.editor.core.getPlainText();
- plugin.sendRequest('checkDocument', textContent, languageCode,
function(data, request, someObject)
+ plugin.sendRequest('', textContent, languageCode, function(data,
request, jqXHR)
{
/* turn off the spinning thingie */
plugin.editor.setProgressState(0);
/* if the server is not accepting requests, let the user know */
- if (request.status != 200 || request.responseText.substr(1, 4)
== 'html' || request.responseText == '')
+ if (jqXHR.status != 200 || jqXHR.responseText.substr(1, 4) ==
'html' || jqXHR.responseText == '')
{
ed.windowManager.alert(
plugin.editor.getLang('AtD.message_server_error', 'There was a problem
communicating with the service. Try again in one minute.') );
return;
}
/* check to see if things are broken first and foremost */
- if (request.responseXML.getElementsByTagName('message').item(0)
!= null)
+ if (jqXHR.responseXML.getElementsByTagName('message').item(0)
!= null)
{
-
ed.windowManager.alert(request.responseXML.getElementsByTagName('message').item(0).firstChild.data);
+
ed.windowManager.alert(jqXHR.responseXML.getElementsByTagName('message').item(0).firstChild.data);
return;
}
- var results = core.processXML(request.responseXML);
+ var results = core.processXML(jqXHR.responseXML);
if (results.length == 0) {
var lang =
plugin.editor.getParam('languagetool_i18n_current_lang')();
@@ -435,7 +435,20 @@
alert('Please specify: languagetool_rpc_url');
return;
}
+
+ jQuery.ajax({
+ url: url + "/" + file,
+ type: "POST",
+ data: "text=" + encodeURI(data).replace(/&/g, '%26') +
"&language=" + encodeURI(languageCode),
+ success: success,
+ error: function(type, req, o) {
+ plugin.editor.setProgressState(0);
+ alert("Could not send request to\n" + o.url + "\nError: " +
type + "\nStatus code: " + req.status + "\nPlease make sure your network
connection works.");
+ }
+ });
+ /* this causes an OPTIONS request to be send as a preflight - LT
server doesn't support that,
+ thus we're using jQuery.ajax() instead
tinymce.util.XHR.send({
url : url + "/" + file,
content_type : 'text/xml',
@@ -449,7 +462,7 @@
plugin.editor.setProgressState(0);
alert("Could not send request to\n" + o.url + "\nError: " +
type + "\nStatus code: " + req.status + "\nPlease make sure your network
connection works.");
}
- });
+ });*/
}
});
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Languagetool-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-commits