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
Languagetool-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/languagetool-commits

Reply via email to