Skip to content

Commit e330858

Browse files
committed
Use Servlet API 3.0 HttpServletRequest.getPart to process form data
Fixes: #455 - Add @MultipartConfig annotation - use HttpServletRequest.getPart to get the form data
1 parent 98ee624 commit e330858

File tree

3 files changed

+57
-523
lines changed

3 files changed

+57
-523
lines changed

org/w3c/css/servlet/CssValidator.java

Lines changed: 56 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.w3c.css.parser.CssError;
2323
import org.w3c.css.parser.Errors;
2424
import org.w3c.css.util.ApplContext;
25-
import org.w3c.css.util.Codecs;
2625
import org.w3c.css.util.CssVersion;
2726
import org.w3c.css.util.FakeFile;
2827
import org.w3c.css.util.HTTPURL;
@@ -35,10 +34,12 @@
3534
import javax.servlet.ServletConfig;
3635
import javax.servlet.ServletException;
3736
import javax.servlet.ServletInputStream;
37+
import javax.servlet.annotation.MultipartConfig;
3838
import javax.servlet.http.HttpServlet;
3939
import javax.servlet.http.HttpServletRequest;
4040
import javax.servlet.http.HttpServletResponse;
4141
import java.io.ByteArrayInputStream;
42+
import java.io.ByteArrayOutputStream;
4243
import java.io.IOException;
4344
import java.io.InputStream;
4445
import java.io.OutputStream;
@@ -47,13 +48,15 @@
4748
import java.net.ProtocolException;
4849
import java.net.URL;
4950
import java.nio.charset.Charset;
51+
import java.nio.charset.StandardCharsets;
5052

5153
/**
5254
* This class is a servlet to use the validator.
5355
*
5456
* @version $Revision$
5557
*/
5658
@SuppressWarnings("serial")
59+
@MultipartConfig
5760
public final class CssValidator extends HttpServlet {
5861

5962
final static String texthtml = "text/html";
@@ -529,13 +532,6 @@ public void doPost(HttpServletRequest req, HttpServletResponse res)
529532
String vendorExtensionAsWarnings = null;
530533
String inputType = "none";
531534

532-
ServletInputStream in = req.getInputStream();
533-
534-
byte[] buf = new byte[2048];
535-
byte[] general = new byte[65536];
536-
int count = 0;
537-
int len;
538-
539535
if (req.getParameter("debug") != null) {
540536
Util.onDebug = req.getParameter("debug").equals("true");
541537
if (Util.onDebug) {
@@ -555,71 +551,62 @@ public void doPost(HttpServletRequest req, HttpServletResponse res)
555551
}
556552

557553
try {
558-
while ((len = in.readLine(buf, 0, buf.length)) != -1) {
559-
if (len >= 2 && buf[len - 1] == '\n' && buf[len - 2] == '\r') {
560-
len -= 1;
561-
buf[len - 1] = (byte) '\n';
562-
}
563-
if (len != 0 && buf[len - 1] == '\r') {
564-
buf[len - 1] = (byte) '\n';
565-
}
554+
if (req.getPart(opt_file) != null) {
555+
file = new FakeFile(req.getPart(opt_file).getSubmittedFileName());
556+
file.setContentType(req.getPart(opt_file).getContentType());
566557

567-
if (general.length < (count + len)) {
568-
byte[] old = general;
569-
general = new byte[old.length * 2];
570-
System.arraycopy(old, 0, general, 0, old.length);
571-
}
572-
System.arraycopy(buf, 0, general, count, len);
573-
count += len;
574-
}
575-
} finally {
576-
in.close();
577-
}
558+
InputStream is2 = req.getPart(opt_file).getInputStream();
559+
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
578560

579-
try {
580-
buf = new byte[count];
581-
System.arraycopy(general, 0, buf, 0, count);
582-
for (Pair<String, ?> pair : Codecs.mpFormDataDecode(buf, req.getContentType())) {
583-
switch (pair.getKey()) {
584-
case opt_file:
585-
file = (FakeFile) pair.getValue();
586-
break;
587-
case opt_text:
588-
text = (String) pair.getValue();
589-
break;
590-
case opt_textcharset:
591-
textcharset = (Charset) pair.getValue();
592-
break;
593-
case opt_lang:
594-
lang = (String) pair.getValue();
595-
break;
596-
case opt_output:
597-
output = (String) pair.getValue();
598-
break;
599-
case opt_warning:
600-
warning = (String) pair.getValue();
601-
break;
602-
case opt_error:
603-
error = (String) pair.getValue();
604-
break;
605-
case opt_profile:
606-
profile = (String) pair.getValue();
607-
break;
608-
case opt_usermedium:
609-
usermedium = (String) pair.getValue();
610-
break;
611-
case opt_vextwarning:
612-
vendorExtensionAsWarnings = (String) pair.getValue();
613-
break;
614-
case opt_type:
615-
inputType = (String) pair.getValue();
616-
break;
617-
default:
618-
// log extra parameters?
561+
int nRead;
562+
byte[] data = new byte[16384];
563+
564+
while ((nRead = is2.read(data, 0, data.length)) != -1) {
565+
buffer.write(data, 0, nRead);
619566
}
567+
568+
file.write(buffer.toByteArray(), 0, buffer.size());
620569
}
621-
} catch (Exception e) {
622-
System.out.println("Oups! Error in Util/Codecs.java?!?");
570+
571+
textcharset = req.getCharacterEncoding() != null ? Charset.forName(req.getCharacterEncoding()) : StandardCharsets.UTF_8;
572+
text = req.getPart(opt_text) != null ? new String(
573+
req.getPart(opt_text).getInputStream().readAllBytes(),
574+
textcharset
575+
) : text;
576+
lang = req.getPart(opt_lang) != null ? new String(
577+
req.getPart(opt_lang).getInputStream().readAllBytes(),
578+
textcharset
579+
) : lang;
580+
output = req.getPart(opt_output) != null ? new String(
581+
req.getPart(opt_output).getInputStream().readAllBytes(),
582+
textcharset
583+
) : output;
584+
warning = req.getPart(opt_warning) != null ? new String(
585+
req.getPart(opt_warning).getInputStream().readAllBytes(),
586+
textcharset
587+
) : warning;
588+
error = req.getPart(opt_error) != null ? new String(
589+
req.getPart(opt_error).getInputStream().readAllBytes(),
590+
textcharset
591+
) : error;
592+
profile = req.getPart(opt_profile) != null ? new String(
593+
req.getPart(opt_profile).getInputStream().readAllBytes(),
594+
textcharset
595+
) : profile;
596+
usermedium = req.getPart(opt_usermedium) != null ? new String(
597+
req.getPart(opt_usermedium).getInputStream().readAllBytes(),
598+
textcharset
599+
) : usermedium;
600+
vendorExtensionAsWarnings = req.getPart(opt_vextwarning) != null ? new String(
601+
req.getPart(opt_vextwarning).getInputStream().readAllBytes(),
602+
textcharset
603+
) : vendorExtensionAsWarnings;
604+
inputType = req.getPart(opt_type) != null ? new String(
605+
req.getPart(opt_type).getInputStream().readAllBytes(),
606+
textcharset
607+
) : inputType;
608+
} catch (IOException e) {
609+
System.out.println("Error getting form data");
623610
e.printStackTrace();
624611
}
625612

0 commit comments

Comments
 (0)