Revision: 8395
http://languagetool.svn.sourceforge.net/languagetool/?rev=8395&view=rev
Author: dnaber
Date: 2012-11-13 22:13:04 +0000 (Tue, 13 Nov 2012)
Log Message:
-----------
https server: new property maxTextLength to limit the text length - longer
texts will cause an error
Modified Paths:
--------------
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
Added Paths:
-----------
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties
Modified:
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java
===================================================================
--- trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java
2012-11-13 21:15:50 UTC (rev 8394)
+++ trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServer.java
2012-11-13 22:13:04 UTC (rev 8395)
@@ -65,7 +65,9 @@
final SSLContext sslContext = getSslContext(config.getKeystore(),
config.getKeyStorePassword());
final HttpsConfigurator configurator = getConfigurator(sslContext);
((HttpsServer)server).setHttpsConfigurator(configurator);
- server.createContext("/", new
LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally));
+ final LanguageToolHttpHandler httpHandler = new
LanguageToolHttpHandler(config.isVerbose(), allowedIps, runInternally);
+ httpHandler.setMaxTextLength(config.getMaxTextLength());
+ server.createContext("/", httpHandler);
} catch (BindException e) {
final ResourceBundle messages = JLanguageTool.getMessageBundle();
final String message = Tools.makeTexti18n(messages,
"https_server_start_failed", host, Integer.toString(port));
@@ -112,8 +114,9 @@
System.out.println("Usage: " + HTTPSServer.class.getSimpleName()
+ " --config propertyFile [--port|-p port] [--public]");
System.out.println(" --config file a Java property file with values
for:");
- System.out.println(" 'keystore' - a Java keystore with
an SSL certificate");
- System.out.println(" 'password' - the keystore's
password");
+ System.out.println(" 'keystore' - a Java keystore with
an SSL certificate");
+ System.out.println(" 'password' - the keystore's
password");
+ System.out.println(" 'maxTextLength' - maximum text
length, longer texts will cause an error (optional)");
printCommonOptions();
System.exit(1);
}
Modified:
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
===================================================================
---
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
2012-11-13 21:15:50 UTC (rev 8394)
+++
trunk/JLanguageTool/src/main/java/org/languagetool/server/HTTPSServerConfig.java
2012-11-13 22:13:04 UTC (rev 8395)
@@ -31,6 +31,8 @@
private final File keystore;
private final String keyStorePassword;
+ private int maxTextLength = Integer.MAX_VALUE;
+
/**
* @param keystore a Java keystore file as created with the <tt>keytool</tt>
command
* @param keyStorePassword the password for the keystore
@@ -74,6 +76,7 @@
props.load(fis);
keystore = new File(getProperty(props, "keystore", config));
keyStorePassword = getProperty(props, "password", config);
+ maxTextLength = Integer.parseInt(getOptionalProperty(props,
"maxTextLength", Integer.toString(Integer.MAX_VALUE)));
} finally {
fis.close();
}
@@ -82,6 +85,26 @@
}
}
+ /**
+ * @param maxTextLength the maximum text length allowed (in number of
characters), texts that are longer
+ * will cause an exception when being checked
+ */
+ public void setMaxTextLength(int maxTextLength) {
+ this.maxTextLength = maxTextLength;
+ }
+
+ int getMaxTextLength() {
+ return maxTextLength;
+ }
+
+ File getKeystore() {
+ return keystore;
+ }
+
+ String getKeyStorePassword() {
+ return keyStorePassword;
+ }
+
private String getProperty(Properties props, String propertyName, File
config) {
final String propertyValue = (String)props.get(propertyName);
if (propertyValue == null || propertyValue.trim().isEmpty()) {
@@ -90,11 +113,11 @@
return propertyValue;
}
- File getKeystore() {
- return keystore;
+ private String getOptionalProperty(Properties props, String propertyName,
String defaultValue) {
+ final String propertyValue = (String)props.get(propertyName);
+ if (propertyValue == null) {
+ return defaultValue;
+ }
+ return propertyValue;
}
-
- String getKeyStorePassword() {
- return keyStorePassword;
- }
}
Modified:
trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
===================================================================
---
trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
2012-11-13 21:15:50 UTC (rev 8394)
+++
trunk/JLanguageTool/src/main/java/org/languagetool/server/LanguageToolHttpHandler.java
2012-11-13 22:13:04 UTC (rev 8395)
@@ -43,6 +43,7 @@
private String[] enabledRules = {};
private String[] disabledRules = {};
+ private int maxTextLength = Integer.MAX_VALUE;
/**
* @param verbose print the input text in case of exceptions
@@ -56,6 +57,10 @@
config = new Configuration(null);
}
+ void setMaxTextLength(int maxTextLength) {
+ this.maxTextLength = maxTextLength;
+ }
+
@Override
public void handle(HttpExchange httpExchange) throws IOException {
final long timeStart = System.currentTimeMillis();
@@ -101,7 +106,7 @@
private Map<String, String> getRequestQuery(HttpExchange httpExchange, URI
requestedUri) throws IOException {
Map<String, String> parameters;
- if ("post".equalsIgnoreCase(httpExchange.getRequestMethod())) { // POST
+ if ("post".equalsIgnoreCase(httpExchange.getRequestMethod())) {
final InputStreamReader isr = new
InputStreamReader(httpExchange.getRequestBody(), ENCODING);
try {
final BufferedReader br = new BufferedReader(isr);
@@ -123,7 +128,6 @@
private void printListOfLanguages(HttpExchange httpExchange) throws
IOException {
httpExchange.getResponseHeaders().set("Content-Type", CONTENT_TYPE_VALUE);
- //httpExchange.getResponseHeaders().set("Access-Control-Allow-Origin",
"*");
final String response = getSupportedLanguagesAsXML();
httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK,
response.getBytes(ENCODING).length);
httpExchange.getResponseBody().write(response.getBytes(ENCODING));
@@ -150,6 +154,9 @@
}
private void checkText(String text, HttpExchange httpExchange, Map<String,
String> parameters) throws Exception {
+ if (text.length() > maxTextLength) {
+ throw new IllegalArgumentException("Text is " + text.length() + "
characters long, exceeding maximum length of " + maxTextLength);
+ }
final String langParam = parameters.get("language");
final String autodetectParam = parameters.get("autodetect");
if (langParam == null && (autodetectParam == null ||
!autodetectParam.equals("1"))) {
@@ -259,11 +266,9 @@
if (!useQuerySettings && internalServer && config.getUseGUIConfig()) { //
use the GUI config values
configureGUI(newLanguageTool);
}
-
if (useQuerySettings) {
Tools.selectRules(newLanguageTool, disabledRules, enabledRules);
}
-
return newLanguageTool;
}
Modified:
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
===================================================================
---
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
2012-11-13 21:15:50 UTC (rev 8394)
+++
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerConfigTest.java
2012-11-13 22:13:04 UTC (rev 8395)
@@ -41,6 +41,7 @@
assertThat(config1.isVerbose(), is(false));
assertThat(config1.getKeystore().toString(),
is("src/test/resources/org/languagetool/test-keystore.jks"));
assertThat(config1.getKeyStorePassword(), is("mytest"));
+ assertThat(config1.getMaxTextLength(), is(50000));
final HTTPSServerConfig config2 = new HTTPSServerConfig(("-p 9999 --config
" + propertyFile).split(" "));
assertThat(config2.getPort(), is(9999));
@@ -48,9 +49,22 @@
assertThat(config2.isVerbose(), is(false));
assertThat(config2.getKeystore().toString(),
is("src/test/resources/org/languagetool/test-keystore.jks"));
assertThat(config2.getKeyStorePassword(), is("mytest"));
+ assertThat(config2.getMaxTextLength(), is(50000));
}
@Test
+ public void testMinimalPropertyFile() {
+ final String propertyFile =
HTTPSServerConfigTest.class.getResource("/org/languagetool/server/https-server-minimal.properties").getFile();
+ final HTTPSServerConfig config = new HTTPSServerConfig(("--config " +
propertyFile).split(" "));
+ assertThat(config.getPort(), is(8081));
+ assertThat(config.isPublicAccess(), is(false));
+ assertThat(config.isVerbose(), is(false));
+ assertThat(config.getKeystore().toString(),
is("src/test/resources/org/languagetool/test-keystore.jks"));
+ assertThat(config.getKeyStorePassword(), is("mytest"));
+ assertThat(config.getMaxTextLength(), is(Integer.MAX_VALUE));
+ }
+
+ @Test
public void testMissingPropertyFile() {
final String propertyFile = "/does-not-exist";
try {
Modified:
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java
===================================================================
---
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java
2012-11-13 21:15:50 UTC (rev 8394)
+++
trunk/JLanguageTool/src/test/java/org/languagetool/server/HTTPSServerTest.java
2012-11-13 22:13:04 UTC (rev 8395)
@@ -22,8 +22,10 @@
import java.io.File;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.URL;
+import java.net.URLEncoder;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -42,6 +44,7 @@
}
final File keyStoreFile = new File(keystore.getFile());
final HTTPSServerConfig config = new HTTPSServerConfig(keyStoreFile,
KEYSTORE_PASSWORD);
+ config.setMaxTextLength(500);
final HTTPSServer server = new HTTPSServer(config, false,
HTTPServerConfig.DEFAULT_HOST, null);
try {
server.run();
@@ -52,15 +55,35 @@
}
private void runTests() throws IOException {
- final String httpsPrefix = "https://localhost:" +
HTTPServerConfig.DEFAULT_PORT + "/";
try {
final String httpPrefix = "http://localhost:" +
HTTPServerConfig.DEFAULT_PORT + "/";
HTTPTools.checkAtUrl(new URL(httpPrefix + "?text=a+test&language=en"));
fail("HTTP should not work, only HTTPS");
} catch (SocketException expected) {}
+ final String httpsPrefix = "https://localhost:" +
HTTPServerConfig.DEFAULT_PORT + "/";
+
final String result = HTTPTools.checkAtUrl(new URL(httpsPrefix +
"?text=a+test&language=en"));
assertTrue("Got " + result, result.contains("UPPERCASE_SENTENCE_START"));
+
+ final StringBuilder longText = new StringBuilder();
+ while (longText.length() < 490) {
+ longText.append("B ");
+ }
+ final String result2 = HTTPTools.checkAtUrl(new URL(httpsPrefix + "?text="
+ encode(longText.toString()) + "&language=en"));
+ assertTrue("Got " + result2,
!result2.contains("UPPERCASE_SENTENCE_START"));
+ assertTrue("Got " + result2, result2.contains("PHRASE_REPETITION"));
+
+ final String overlyLongText = longText.toString() + " and some more to get
over the limit of 500";
+ try {
+ System.out.println("Now checking text that is too long, please ignore
the following error...");
+ HTTPTools.checkAtUrl(new URL(httpsPrefix + "?text=" +
encode(overlyLongText) + "&language=en"));
+ fail();
+ } catch (IOException expected) {}
}
+ private String encode(String text) throws UnsupportedEncodingException {
+ return URLEncoder.encode(text, "utf-8");
+ }
+
}
Added:
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties
===================================================================
---
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties
(rev 0)
+++
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server-minimal.properties
2012-11-13 22:13:04 UTC (rev 8395)
@@ -0,0 +1,2 @@
+keystore = src/test/resources/org/languagetool/test-keystore.jks
+password = mytest
Modified:
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
===================================================================
---
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
2012-11-13 21:15:50 UTC (rev 8394)
+++
trunk/JLanguageTool/src/test/resources/org/languagetool/server/https-server.properties
2012-11-13 22:13:04 UTC (rev 8395)
@@ -1,2 +1,3 @@
keystore = src/test/resources/org/languagetool/test-keystore.jks
password = mytest
+maxTextLength = 50000
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
Languagetool-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-commits