aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/com/vaadin/server/AbstractCommunicationManager.java10
-rw-r--r--uitest/src/com/vaadin/tests/components/upload/TestFileUploadSize.java80
2 files changed, 85 insertions, 5 deletions
diff --git a/server/src/com/vaadin/server/AbstractCommunicationManager.java b/server/src/com/vaadin/server/AbstractCommunicationManager.java
index c676cb2ce3..c1c18901b4 100644
--- a/server/src/com/vaadin/server/AbstractCommunicationManager.java
+++ b/server/src/com/vaadin/server/AbstractCommunicationManager.java
@@ -186,7 +186,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
private static final String CRLF = "\r\n";
- private static final String UTF8 = "UTF8";
+ private static final String UTF8 = "UTF-8";
private static String readLine(InputStream stream) throws IOException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
@@ -234,14 +234,14 @@ public abstract class AbstractCommunicationManager implements Serializable {
*/
while (!atStart) {
String readLine = readLine(inputStream);
- contentLength -= (readLine.length() + 2);
+ contentLength -= (readLine.getBytes(UTF8).length + CRLF.length());
if (readLine.startsWith("Content-Disposition:")
&& readLine.indexOf("filename=") > 0) {
rawfilename = readLine.replaceAll(".*filename=", "");
- String parenthesis = rawfilename.substring(0, 1);
+ char quote = rawfilename.charAt(0);
rawfilename = rawfilename.substring(1);
rawfilename = rawfilename.substring(0,
- rawfilename.indexOf(parenthesis));
+ rawfilename.indexOf(quote));
firstFileFieldFound = true;
} else if (firstFileFieldFound && readLine.equals("")) {
atStart = true;
@@ -251,7 +251,7 @@ public abstract class AbstractCommunicationManager implements Serializable {
}
contentLength -= (boundary.length() + CRLF.length() + 2
- * DASHDASH.length() + 2); // 2 == CRLF
+ * DASHDASH.length() + CRLF.length());
/*
* Reads bytes from the underlying stream. Compares the read bytes to
diff --git a/uitest/src/com/vaadin/tests/components/upload/TestFileUploadSize.java b/uitest/src/com/vaadin/tests/components/upload/TestFileUploadSize.java
new file mode 100644
index 0000000000..32f5c93bfd
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/upload/TestFileUploadSize.java
@@ -0,0 +1,80 @@
+package com.vaadin.tests.components.upload;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+import com.vaadin.shared.ui.MarginInfo;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.Notification;
+import com.vaadin.ui.Upload;
+import com.vaadin.ui.Upload.FinishedEvent;
+import com.vaadin.ui.Upload.Receiver;
+import com.vaadin.ui.Upload.StartedEvent;
+
+public class TestFileUploadSize extends TestBase implements Receiver {
+
+ private Label label = new Label("No finished uploads.");
+ private Label receivedSize = new Label("-");
+ private Label expectedSize = new Label("-");
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ @Override
+ protected void setup() {
+ getLayout().setMargin(new MarginInfo(true, false, false, false));
+ getLayout().setSpacing(true);
+
+ Upload u = new Upload("Upload", new Upload.Receiver() {
+
+ public OutputStream receiveUpload(String filename, String mimeType) {
+ return baos;
+ }
+ });
+ u.setId("UPL");
+ u.addStartedListener(new Upload.StartedListener() {
+
+ public void uploadStarted(StartedEvent event) {
+ expectedSize.setValue(String.valueOf(event.getContentLength()));
+ }
+ });
+ u.addFinishedListener(new Upload.FinishedListener() {
+
+ public void uploadFinished(FinishedEvent event) {
+ label.setValue("Upload finished. Name: " + event.getFilename());
+ receivedSize.setValue(String.valueOf(baos.size()));
+ baos.reset();
+ }
+ });
+
+ expectedSize.setId("expected");
+ receivedSize.setId("received");
+
+ GridLayout grid = new GridLayout(2, 2);
+ grid.addComponent(new Label("Expected size:"), 0, 0);
+ grid.addComponent(new Label("Received size:"), 0, 1);
+ grid.addComponent(expectedSize, 1, 0);
+ grid.addComponent(receivedSize, 1, 1);
+
+ addComponent(label);
+ addComponent(grid);
+ addComponent(u);
+ }
+
+ public OutputStream receiveUpload(String filename, String MIMEType) {
+ Notification.show("Receiving upload");
+ return new ByteArrayOutputStream();
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 9548;
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Multibyte characters in filenames should not cause the upload size to be computed incorrectly";
+ }
+
+}