From c0dcf9a0a27948c549846784d636647ca0d331a9 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 21 Mar 2018 16:14:43 -0500 Subject: [PATCH] Issue #1027 - multipart testing examples Adding raw/binary gitattributes Signed-off-by: Joakim Erdfelt --- .gitattributes | 3 +- .../server/handler/ResourceHandlerTest.java | 4 +- .../jetty/util/MultiPartParsingTest.java | 282 +++++ .../multipart-base64-long.expected.txt | 4 + .../multipart/multipart-base64-long.raw | 8 + .../multipart/multipart-base64.expected.txt | 4 + .../resources/multipart/multipart-base64.raw | 389 +++++++ .../multipart/multipart-complex.expected.txt | 9 + .../resources/multipart/multipart-complex.raw | Bin 0 -> 22929 bytes .../multipart-duplicate-names-1.expected.txt | 2 + .../multipart/multipart-duplicate-names-1.raw | Bin 0 -> 1859 bytes .../multipart-encoding-mess.expected.txt | 4 + .../multipart/multipart-encoding-mess.raw | 1009 +++++++++++++++++ ...ultipart-inside-itself-binary.expected.txt | 6 + .../multipart-inside-itself-binary.raw | 50 + .../multipart-inside-itself.expected.txt | 6 + .../multipart/multipart-inside-itself.raw | 42 + .../multipart-number-browser.expected.txt | 3 + .../multipart/multipart-number-browser.raw | 5 + .../multipart-number-strict.expected.txt | 3 + .../multipart/multipart-number-strict.raw | 7 + .../multipart/multipart-sjis.expected.txt | 4 + .../resources/multipart/multipart-sjis.raw | 13 + .../multipart-strange-quoting.expected.txt | 5 + .../multipart/multipart-strange-quoting.raw | 26 + .../multipart-text-files.expected.txt | 9 + .../multipart/multipart-text-files.raw | 23 + .../multipart-unicode-names.expected.txt | 5 + .../multipart/multipart-unicode-names.raw | 13 + .../multipart-uppercase.expected.txt | 5 + .../multipart/multipart-uppercase.raw | 13 + ...ltipart-x-www-form-urlencoded.expected.txt | 5 + .../multipart-x-www-form-urlencoded.raw | 7 + .../multipart-zencoding.expected.txt | 8 + .../multipart/multipart-zencoding.raw | Bin 0 -> 1830 bytes 35 files changed, 1973 insertions(+), 3 deletions(-) create mode 100644 jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartParsingTest.java create mode 100644 jetty-util/src/test/resources/multipart/multipart-base64-long.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-base64-long.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-base64.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-base64.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-complex.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-complex.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-duplicate-names-1.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-duplicate-names-1.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-encoding-mess.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-encoding-mess.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-inside-itself.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-inside-itself.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-number-browser.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-number-browser.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-number-strict.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-number-strict.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-sjis.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-sjis.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-strange-quoting.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-strange-quoting.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-text-files.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-text-files.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-unicode-names.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-unicode-names.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-uppercase.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-uppercase.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.raw create mode 100644 jetty-util/src/test/resources/multipart/multipart-zencoding.expected.txt create mode 100644 jetty-util/src/test/resources/multipart/multipart-zencoding.raw diff --git a/.gitattributes b/.gitattributes index 2d74f3a7f01..b9b0a86549a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,4 +5,5 @@ *.java eol=lf *.xml eol=lf Jenkinsfile eol=lf -*.js eol=lf \ No newline at end of file +*.js eol=lf +*.raw binary \ No newline at end of file diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerTest.java index 91d0ededdd1..17d48320c00 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerTest.java @@ -170,14 +170,14 @@ public class ResourceHandlerTest assertThat(response.getContent(),containsString("big.txt")); assertThat(response.getContent(),containsString("bigger.txt")); assertThat(response.getContent(),containsString("directory")); - assertThat(response.getContent(),containsString("simple.txt")); + assertThat(response.getContent(),containsString("simple.raw")); } @Test public void testHeaders() throws Exception { HttpTester.Response response = HttpTester.parseResponse( - _local.getResponse("GET /resource/simple.txt HTTP/1.0\r\n\r\n")); + _local.getResponse("GET /resource/simple.raw HTTP/1.0\r\n\r\n")); assertThat(response.getStatus(),equalTo(200)); assertThat(response.get(CONTENT_TYPE),equalTo("text/plain")); assertThat(response.get(LAST_MODIFIED),Matchers.notNullValue()); diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartParsingTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartParsingTest.java new file mode 100644 index 00000000000..67e156f6cc9 --- /dev/null +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartParsingTest.java @@ -0,0 +1,282 @@ +// +// ======================================================================== +// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.util; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.DigestOutputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import javax.servlet.MultipartConfigElement; +import javax.servlet.http.Part; + +import org.eclipse.jetty.toolchain.test.Hex; +import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.toolchain.test.TestingDir; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class MultiPartParsingTest +{ + + public static final int MAX_FILE_SIZE = 60 * 1024; + public static final int MAX_REQUEST_SIZE = 1024 * 1024; + public static final int FILE_SIZE_THRESHOLD = 50; + + @Parameterized.Parameters(name = "{0}") + public static List data() + { + List ret = new ArrayList<>(); + + ret.add(new String[]{"multipart-text-files"}); + ret.add(new String[]{"multipart-base64"}); + ret.add(new String[]{"multipart-base64-long"}); + ret.add(new String[]{"multipart-complex"}); + ret.add(new String[]{"multipart-duplicate-names-1"}); + ret.add(new String[]{"multipart-encoding-mess"}); + ret.add(new String[]{"multipart-inside-itself"}); + ret.add(new String[]{"multipart-inside-itself-binary"}); + ret.add(new String[]{"multipart-number-browser"}); + ret.add(new String[]{"multipart-number-strict"}); + ret.add(new String[]{"multipart-sjis"}); + ret.add(new String[]{"multipart-strange-quoting"}); + ret.add(new String[]{"multipart-unicode-names"}); + ret.add(new String[]{"multipart-uppercase"}); + ret.add(new String[]{"multipart-x-www-form-urlencoded"}); + ret.add(new String[]{"multipart-zencoding"}); + + return ret; + } + + @Rule + public TestingDir testingDir = new TestingDir(); + + private final Path multipartRawFile; + private final MultipartExpectations multipartExpectations; + + public MultiPartParsingTest(String rawPrefix) throws IOException + { + multipartRawFile = MavenTestingUtils.getTestResourcePathFile("multipart/" + rawPrefix + ".raw"); + Path expectationPath = MavenTestingUtils.getTestResourcePathFile("multipart/" + rawPrefix + ".expected.txt"); + multipartExpectations = new MultipartExpectations(expectationPath); + } + + @Test + public void testParse() throws IOException, NoSuchAlgorithmException + { + Path outputDir = testingDir.getEmptyPathDir(); + MultipartConfigElement config = newMultipartConfigElement(outputDir); + try (InputStream in = Files.newInputStream(multipartRawFile)) + { + MultiPartInputStreamParser parser = new MultiPartInputStreamParser( + in, multipartExpectations.contentType, config, outputDir.toFile()); + parser.parse(); + + // Evaluate Count + if (multipartExpectations.partCount >= 0) + { + assertThat("Mulitpart.parts.size", parser.getParts().size(), is(multipartExpectations.partCount)); + } + + // Evaluate expected Contents + for (NameValue expected : multipartExpectations.partContainsContents) + { + Part part = parser.getPart(expected.name); + assertThat("Part[" + expected.name + "]", part, is(notNullValue())); + try (InputStream partInputStream = part.getInputStream()) + { + String charset = getCharsetFromContentType(part.getContentType(), UTF_8); + String contents = IO.toString(partInputStream, charset); + assertThat("Part[" + expected.name + "].contents", contents, containsString(expected.value)); + } + } + + // Evaluate expected filenames + for (NameValue expected : multipartExpectations.partFilenames) + { + Part part = parser.getPart(expected.name); + assertThat("Part[" + expected.name + "]", part, is(notNullValue())); + assertThat("Part[" + expected.name + "]", part.getSubmittedFileName(), is(expected.value)); + } + + // Evaluate expected contents checksums + for (NameValue expected : multipartExpectations.partSha1sums) + { + Part part = parser.getPart(expected.name); + assertThat("Part[" + expected.name + "]", part, is(notNullValue())); + MessageDigest digest = MessageDigest.getInstance("SHA1"); + try (InputStream partInputStream = part.getInputStream(); + NoOpOutputStream noop = new NoOpOutputStream(); + DigestOutputStream digester = new DigestOutputStream(noop, digest)) + { + IO.copy(partInputStream, digester); + String actualSha1sum = Hex.asHex(digest.digest()); + assertThat("Part[" + expected.name + "].sha1sum", actualSha1sum, containsString(expected.value)); + } + } + } + } + + private MultipartConfigElement newMultipartConfigElement(Path path) + { + return new MultipartConfigElement(path.toString(), MAX_FILE_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD); + } + + private String getCharsetFromContentType(String contentType, Charset defaultCharset) + { + if(StringUtil.isBlank(contentType)) + { + return defaultCharset.toString(); + } + + QuotedStringTokenizer tok = new QuotedStringTokenizer(contentType, ";", false, false); + while(tok.hasMoreTokens()) + { + String str = tok.nextToken().trim(); + if(str.startsWith("charset=")) + { + return str.substring("charset=".length()); + } + } + + return defaultCharset.toString(); + } + + public static class NameValue + { + public String name; + public String value; + } + + public static class MultipartExpectations + { + public final String contentType; + public final int partCount; + public final List partFilenames = new ArrayList<>(); + public final List partSha1sums = new ArrayList<>(); + public final List partContainsContents = new ArrayList<>(); + + public MultipartExpectations(Path expectationsPath) throws IOException + { + String parsedContentType = null; + String parsedPartCount = "-1"; + + try (BufferedReader reader = Files.newBufferedReader(expectationsPath)) + { + String line; + while ((line = reader.readLine()) != null) + { + line = line.trim(); + if (StringUtil.isBlank(line) || line.startsWith("#")) + { + // skip blanks and comments + continue; + } + + String split[] = line.split("\\|"); + switch (split[0]) + { + case "Content-Type": + parsedContentType = split[1]; + break; + case "Parts-Count": + parsedPartCount = split[1]; + break; + case "Part-ContainsContents": + { + NameValue pair = new NameValue(); + pair.name = split[1]; + pair.value = split[2]; + partContainsContents.add(pair); + break; + } + case "Part-Filename": + { + NameValue pair = new NameValue(); + pair.name = split[1]; + pair.value = split[2]; + partFilenames.add(pair); + break; + } + case "Part-Sha1sum": + { + NameValue pair = new NameValue(); + pair.name = split[1]; + pair.value = split[2]; + partSha1sums.add(pair); + break; + } + default: + throw new IOException("Bad Line in " + expectationsPath + ": " + line); + } + } + } + + Objects.requireNonNull(parsedContentType, "Missing required 'Content-Type' declaration: " + expectationsPath); + this.contentType = parsedContentType; + this.partCount = Integer.parseInt(parsedPartCount); + } + } + + class NoOpOutputStream extends OutputStream + { + @Override + public void write(byte[] b) throws IOException + { + } + + @Override + public void write(byte[] b, int off, int len) throws IOException + { + } + + @Override + public void flush() throws IOException + { + } + + @Override + public void close() throws IOException + { + } + + @Override + public void write(int b) throws IOException + { + } + } +} diff --git a/jetty-util/src/test/resources/multipart/multipart-base64-long.expected.txt b/jetty-util/src/test/resources/multipart/multipart-base64-long.expected.txt new file mode 100644 index 00000000000..2b1d5ded060 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-base64-long.expected.txt @@ -0,0 +1,4 @@ +Content-Type|multipart/form-data; boundary="JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8" +Parts-Count|1 +Part-Filename|png|jetty-avatar-256.png +Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-util/src/test/resources/multipart/multipart-base64-long.raw b/jetty-util/src/test/resources/multipart/multipart-base64-long.raw new file mode 100644 index 00000000000..2e2b4991568 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-base64-long.raw @@ -0,0 +1,8 @@ +--JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8 +Content-ID: +Content-Disposition: form-data; name="png"; filename="jetty-avatar-256.png" +Content-Type: image/png; name=jetty-avatar-256.png +Content-Transfer-Encoding: base64 + +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 +--JuH4rALGPJfmAquncS_U1du8s59GjKKiG9a8-- diff --git a/jetty-util/src/test/resources/multipart/multipart-base64.expected.txt b/jetty-util/src/test/resources/multipart/multipart-base64.expected.txt new file mode 100644 index 00000000000..5d4a189b8dc --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-base64.expected.txt @@ -0,0 +1,4 @@ +Content-Type|multipart/form-data; boundary="8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp" +Parts-Count|1 +Part-Filename|png|jetty-avatar-256.png +Part-Sha1sum|png|e75b73644afe9b234d70da9ff225229de68cdff8 \ No newline at end of file diff --git a/jetty-util/src/test/resources/multipart/multipart-base64.raw b/jetty-util/src/test/resources/multipart/multipart-base64.raw new file mode 100644 index 00000000000..514a6a1ed3c --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-base64.raw @@ -0,0 +1,389 @@ +--8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp +Content-ID: +Content-Disposition: form-data; name="png"; filename="jetty-avatar-256.png" +Content-Type: image/png; name=jetty-avatar-256.png +Content-Transfer-Encoding: base64 + +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 +--8GbcZNTauFWYMt7GeM9BxFMdlNBJ6aLJhGdXp-- diff --git a/jetty-util/src/test/resources/multipart/multipart-complex.expected.txt b/jetty-util/src/test/resources/multipart/multipart-complex.expected.txt new file mode 100644 index 00000000000..1eed38785c1 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-complex.expected.txt @@ -0,0 +1,9 @@ +Content-Type|multipart/form-data; boundary="PMyKOsh8JrSZm-rUF8EJej42yqbh-UWw9FG-" +Parts-Count|6 +Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 +Part-ContainsContents|company|bob & frank's shoe repair +Part-ContainsContents|power|ꬵо𝗋ⲥ𝖾 +Part-ContainsContents|japanese|健治 +Part-ContainsContents|hello|ャユ戆タ +Part-Filename|upload_file|filename +Part-Sha1sum|upload_file|e75b73644afe9b234d70da9ff225229de68cdff8 diff --git a/jetty-util/src/test/resources/multipart/multipart-complex.raw b/jetty-util/src/test/resources/multipart/multipart-complex.raw new file mode 100644 index 0000000000000000000000000000000000000000..e74c27a67daacc6680c483bc89a9952531c1646d GIT binary patch literal 22929 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 literal 0 HcmV?d00001 diff --git a/jetty-util/src/test/resources/multipart/multipart-encoding-mess.expected.txt b/jetty-util/src/test/resources/multipart/multipart-encoding-mess.expected.txt new file mode 100644 index 00000000000..44148c5505f --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-encoding-mess.expected.txt @@ -0,0 +1,4 @@ +Content-Type|multipart/form-data; boundary="CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl" +Parts-Count|168 +Part-ContainsContents|persian-UTF-8|برج بابل +Part-ContainsContents|persian-CESU-8|برج بابل diff --git a/jetty-util/src/test/resources/multipart/multipart-encoding-mess.raw b/jetty-util/src/test/resources/multipart/multipart-encoding-mess.raw new file mode 100644 index 00000000000..a1348ecccf8 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-encoding-mess.raw @@ -0,0 +1,1009 @@ +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-Big5" +Content-Type: text/plain; charset=Big5 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-Big5-HKSCS" +Content-Type: text/plain; charset=Big5-HKSCS +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-CESU-8" +Content-Type: text/plain; charset=CESU-8 +Content-Transfer-Encoding: 8bit + +برج بابل +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-EUC-JP" +Content-Type: text/plain; charset=EUC-JP +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-EUC-KR" +Content-Type: text/plain; charset=EUC-KR +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-GB18030" +Content-Type: text/plain; charset=GB18030 +Content-Transfer-Encoding: 8bit + +101914 10191018 +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-GB2312" +Content-Type: text/plain; charset=GB2312 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-GBK" +Content-Type: text/plain; charset=GBK +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM-Thai" +Content-Type: text/plain; charset=IBM-Thai +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM00858" +Content-Type: text/plain; charset=IBM00858 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01140" +Content-Type: text/plain; charset=IBM01140 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01141" +Content-Type: text/plain; charset=IBM01141 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01142" +Content-Type: text/plain; charset=IBM01142 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01143" +Content-Type: text/plain; charset=IBM01143 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01144" +Content-Type: text/plain; charset=IBM01144 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01145" +Content-Type: text/plain; charset=IBM01145 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01146" +Content-Type: text/plain; charset=IBM01146 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01147" +Content-Type: text/plain; charset=IBM01147 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01148" +Content-Type: text/plain; charset=IBM01148 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM01149" +Content-Type: text/plain; charset=IBM01149 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM037" +Content-Type: text/plain; charset=IBM037 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM1026" +Content-Type: text/plain; charset=IBM1026 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM1047" +Content-Type: text/plain; charset=IBM1047 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM273" +Content-Type: text/plain; charset=IBM273 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM277" +Content-Type: text/plain; charset=IBM277 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM278" +Content-Type: text/plain; charset=IBM278 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM280" +Content-Type: text/plain; charset=IBM280 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM284" +Content-Type: text/plain; charset=IBM284 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM285" +Content-Type: text/plain; charset=IBM285 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM290" +Content-Type: text/plain; charset=IBM290 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM297" +Content-Type: text/plain; charset=IBM297 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM420" +Content-Type: text/plain; charset=IBM420 +Content-Transfer-Encoding: 8bit + +Xug@XVX +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM424" +Content-Type: text/plain; charset=IBM424 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM437" +Content-Type: text/plain; charset=IBM437 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM500" +Content-Type: text/plain; charset=IBM500 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM775" +Content-Type: text/plain; charset=IBM775 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM850" +Content-Type: text/plain; charset=IBM850 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM852" +Content-Type: text/plain; charset=IBM852 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM855" +Content-Type: text/plain; charset=IBM855 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM857" +Content-Type: text/plain; charset=IBM857 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM860" +Content-Type: text/plain; charset=IBM860 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM861" +Content-Type: text/plain; charset=IBM861 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM862" +Content-Type: text/plain; charset=IBM862 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM863" +Content-Type: text/plain; charset=IBM863 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM864" +Content-Type: text/plain; charset=IBM864 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM865" +Content-Type: text/plain; charset=IBM865 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM866" +Content-Type: text/plain; charset=IBM866 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM868" +Content-Type: text/plain; charset=IBM868 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM869" +Content-Type: text/plain; charset=IBM869 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM870" +Content-Type: text/plain; charset=IBM870 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM871" +Content-Type: text/plain; charset=IBM871 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-IBM918" +Content-Type: text/plain; charset=IBM918 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-2022-JP" +Content-Type: text/plain; charset=ISO-2022-JP +Content-Transfer-Encoding: 8bit + +$B!)!)!)(B $B!)!)!)!)(B +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-2022-JP-2" +Content-Type: text/plain; charset=ISO-2022-JP-2 +Content-Transfer-Encoding: 8bit + +$B!)!)!)(B $B!)!)!)!)(B +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-2022-KR" +Content-Type: text/plain; charset=ISO-2022-KR +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-1" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-13" +Content-Type: text/plain; charset=ISO-8859-13 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-15" +Content-Type: text/plain; charset=ISO-8859-15 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-2" +Content-Type: text/plain; charset=ISO-8859-2 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-3" +Content-Type: text/plain; charset=ISO-8859-3 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-4" +Content-Type: text/plain; charset=ISO-8859-4 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-5" +Content-Type: text/plain; charset=ISO-8859-5 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-6" +Content-Type: text/plain; charset=ISO-8859-6 +Content-Transfer-Encoding: 8bit + + +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-7" +Content-Type: text/plain; charset=ISO-8859-7 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-8" +Content-Type: text/plain; charset=ISO-8859-8 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-ISO-8859-9" +Content-Type: text/plain; charset=ISO-8859-9 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-JIS_X0201" +Content-Type: text/plain; charset=JIS_X0201 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-JIS_X0212-1990" +Content-Type: text/plain; charset=JIS_X0212-1990 +Content-Transfer-Encoding: 8bit + +"D"D"D"D"D"D"D"D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-KOI8-R" +Content-Type: text/plain; charset=KOI8-R +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-KOI8-U" +Content-Type: text/plain; charset=KOI8-U +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-Shift_JIS" +Content-Type: text/plain; charset=Shift_JIS +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-TIS-620" +Content-Type: text/plain; charset=TIS-620 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-US-ASCII" +Content-Type: text/plain; charset=US-ASCII +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-16" +Content-Type: text/plain; charset=UTF-16 +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-16BE" +Content-Type: text/plain; charset=UTF-16BE +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-16LE" +Content-Type: text/plain; charset=UTF-16LE +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-32" +Content-Type: text/plain; charset=UTF-32 +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-32BE" +Content-Type: text/plain; charset=UTF-32BE +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-32LE" +Content-Type: text/plain; charset=UTF-32LE +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-UTF-8" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +برج بابل +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1250" +Content-Type: text/plain; charset=windows-1250 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1251" +Content-Type: text/plain; charset=windows-1251 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1252" +Content-Type: text/plain; charset=windows-1252 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1253" +Content-Type: text/plain; charset=windows-1253 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1254" +Content-Type: text/plain; charset=windows-1254 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1255" +Content-Type: text/plain; charset=windows-1255 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1256" +Content-Type: text/plain; charset=windows-1256 +Content-Transfer-Encoding: 8bit + + +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1257" +Content-Type: text/plain; charset=windows-1257 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-1258" +Content-Type: text/plain; charset=windows-1258 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-windows-31j" +Content-Type: text/plain; charset=windows-31j +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-Big5-HKSCS-2001" +Content-Type: text/plain; charset=x-Big5-HKSCS-2001 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-Big5-Solaris" +Content-Type: text/plain; charset=x-Big5-Solaris +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-euc-jp-linux" +Content-Type: text/plain; charset=x-euc-jp-linux +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-EUC-TW" +Content-Type: text/plain; charset=x-EUC-TW +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-eucJP-Open" +Content-Type: text/plain; charset=x-eucJP-Open +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1006" +Content-Type: text/plain; charset=x-IBM1006 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1025" +Content-Type: text/plain; charset=x-IBM1025 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1046" +Content-Type: text/plain; charset=x-IBM1046 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1097" +Content-Type: text/plain; charset=x-IBM1097 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1098" +Content-Type: text/plain; charset=x-IBM1098 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1112" +Content-Type: text/plain; charset=x-IBM1112 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1122" +Content-Type: text/plain; charset=x-IBM1122 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1123" +Content-Type: text/plain; charset=x-IBM1123 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1124" +Content-Type: text/plain; charset=x-IBM1124 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1166" +Content-Type: text/plain; charset=x-IBM1166 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1364" +Content-Type: text/plain; charset=x-IBM1364 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1381" +Content-Type: text/plain; charset=x-IBM1381 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM1383" +Content-Type: text/plain; charset=x-IBM1383 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM300" +Content-Type: text/plain; charset=x-IBM300 +Content-Transfer-Encoding: 8bit + +BoBoBoBoBoBoBoBo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM33722" +Content-Type: text/plain; charset=x-IBM33722 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM737" +Content-Type: text/plain; charset=x-IBM737 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM833" +Content-Type: text/plain; charset=x-IBM833 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM834" +Content-Type: text/plain; charset=x-IBM834 +Content-Transfer-Encoding: 8bit + + +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM856" +Content-Type: text/plain; charset=x-IBM856 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM874" +Content-Type: text/plain; charset=x-IBM874 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM875" +Content-Type: text/plain; charset=x-IBM875 +Content-Transfer-Encoding: 8bit + +???@???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM921" +Content-Type: text/plain; charset=x-IBM921 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM922" +Content-Type: text/plain; charset=x-IBM922 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM930" +Content-Type: text/plain; charset=x-IBM930 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM933" +Content-Type: text/plain; charset=x-IBM933 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM935" +Content-Type: text/plain; charset=x-IBM935 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM937" +Content-Type: text/plain; charset=x-IBM937 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM939" +Content-Type: text/plain; charset=x-IBM939 +Content-Transfer-Encoding: 8bit + +ooo@oooo +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM942" +Content-Type: text/plain; charset=x-IBM942 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM942C" +Content-Type: text/plain; charset=x-IBM942C +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM943" +Content-Type: text/plain; charset=x-IBM943 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM943C" +Content-Type: text/plain; charset=x-IBM943C +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM948" +Content-Type: text/plain; charset=x-IBM948 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM949" +Content-Type: text/plain; charset=x-IBM949 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM949C" +Content-Type: text/plain; charset=x-IBM949C +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM950" +Content-Type: text/plain; charset=x-IBM950 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM964" +Content-Type: text/plain; charset=x-IBM964 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-IBM970" +Content-Type: text/plain; charset=x-IBM970 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-ISCII91" +Content-Type: text/plain; charset=x-ISCII91 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-ISO-2022-CN-CNS" +Content-Type: text/plain; charset=x-ISO-2022-CN-CNS +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-ISO-2022-CN-GB" +Content-Type: text/plain; charset=x-ISO-2022-CN-GB +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-iso-8859-11" +Content-Type: text/plain; charset=x-iso-8859-11 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-JIS0208" +Content-Type: text/plain; charset=x-JIS0208 +Content-Transfer-Encoding: 8bit + +!)!)!)!)!)!)!)!) +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-Johab" +Content-Type: text/plain; charset=x-Johab +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacArabic" +Content-Type: text/plain; charset=x-MacArabic +Content-Transfer-Encoding: 8bit + + +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacCentralEurope" +Content-Type: text/plain; charset=x-MacCentralEurope +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacCroatian" +Content-Type: text/plain; charset=x-MacCroatian +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacCyrillic" +Content-Type: text/plain; charset=x-MacCyrillic +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacDingbat" +Content-Type: text/plain; charset=x-MacDingbat +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacGreek" +Content-Type: text/plain; charset=x-MacGreek +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacHebrew" +Content-Type: text/plain; charset=x-MacHebrew +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacIceland" +Content-Type: text/plain; charset=x-MacIceland +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacRoman" +Content-Type: text/plain; charset=x-MacRoman +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacRomania" +Content-Type: text/plain; charset=x-MacRomania +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacSymbol" +Content-Type: text/plain; charset=x-MacSymbol +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacThai" +Content-Type: text/plain; charset=x-MacThai +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacTurkish" +Content-Type: text/plain; charset=x-MacTurkish +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MacUkraine" +Content-Type: text/plain; charset=x-MacUkraine +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MS932_0213" +Content-Type: text/plain; charset=x-MS932_0213 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MS950-HKSCS" +Content-Type: text/plain; charset=x-MS950-HKSCS +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-MS950-HKSCS-XP" +Content-Type: text/plain; charset=x-MS950-HKSCS-XP +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-mswin-936" +Content-Type: text/plain; charset=x-mswin-936 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-PCK" +Content-Type: text/plain; charset=x-PCK +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-SJIS_0213" +Content-Type: text/plain; charset=x-SJIS_0213 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-UTF-16LE-BOM" +Content-Type: text/plain; charset=x-UTF-16LE-BOM +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-X-UTF-32BE-BOM" +Content-Type: text/plain; charset=X-UTF-32BE-BOM +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-X-UTF-32LE-BOM" +Content-Type: text/plain; charset=X-UTF-32LE-BOM +Content-Transfer-Encoding: 8bit + +(1, ('(D +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-50220" +Content-Type: text/plain; charset=x-windows-50220 +Content-Transfer-Encoding: 8bit + +$B!)!)!)(B $B!)!)!)!)(B +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-50221" +Content-Type: text/plain; charset=x-windows-50221 +Content-Transfer-Encoding: 8bit + +$B!)!)!)(B $B!)!)!)!)(B +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-874" +Content-Type: text/plain; charset=x-windows-874 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-949" +Content-Type: text/plain; charset=x-windows-949 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-950" +Content-Type: text/plain; charset=x-windows-950 +Content-Transfer-Encoding: 8bit + +??? ???? +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl +Content-Disposition: form-data; name="persian-x-windows-iso2022jp" +Content-Type: text/plain; charset=x-windows-iso2022jp +Content-Transfer-Encoding: 8bit + +$B!)!)!)(B $B!)!)!)!)(B +--CVnTR46ddexmZjsh1ORHg9QbCOiLhUYl-- diff --git a/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.expected.txt b/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.expected.txt new file mode 100644 index 00000000000..1074a9a759b --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.expected.txt @@ -0,0 +1,6 @@ +Content-Type|multipart/form-data; boundary="94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8-" +Parts-Count|4 +Part-ContainsContents|reporter| +Part-ContainsContents|timestamp|2018-03-21T19:00:18+00:00 +Part-ContainsContents|comments|this also couldn't be parsed +Part-ContainsContents|attachment|cherry \ No newline at end of file diff --git a/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.raw b/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.raw new file mode 100644 index 00000000000..200235e6d3b --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-inside-itself-binary.raw @@ -0,0 +1,50 @@ +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8- +Content-Disposition: form-data; name="reporter" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + + +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8- +Content-Disposition: form-data; name="timestamp" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +2018-03-21T19:00:18+00:00 +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8- +Content-Disposition: form-data; name="comments" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +this also couldn't be parsed +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8- +Content-Disposition: form-data; name="attachment" +Content-Type: application/octet-stream +Content-Transfer-Encoding: binary + +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0v +Content-Disposition: form-data; name="fruit" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +cherry +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0v +Content-Disposition: form-data; name="color" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +red +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0v +Content-Disposition: form-data; name="cost" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +$1.20 USG +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0v +Content-Disposition: form-data; name="comments" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8- +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0v-- + +--94GJ2MW4vpjh92qj-CHjUUIwb9X8Y2LqkU2Yxn0vTU2oHy5jk6_Kpxn2aE9EokEiRGox4eWfAYP8--- diff --git a/jetty-util/src/test/resources/multipart/multipart-inside-itself.expected.txt b/jetty-util/src/test/resources/multipart/multipart-inside-itself.expected.txt new file mode 100644 index 00000000000..4f68cd2fa81 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-inside-itself.expected.txt @@ -0,0 +1,6 @@ +Content-Type|multipart/form-data; boundary="kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x" +Parts-Count|4 +Part-ContainsContents|reporter| +Part-ContainsContents|timestamp|2018-03-21T18:52:18+00:00 +Part-ContainsContents|comments|this couldn't be parsed +Part-ContainsContents|attachment|banana \ No newline at end of file diff --git a/jetty-util/src/test/resources/multipart/multipart-inside-itself.raw b/jetty-util/src/test/resources/multipart/multipart-inside-itself.raw new file mode 100644 index 00000000000..9157af95046 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-inside-itself.raw @@ -0,0 +1,42 @@ +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x +Content-Disposition: form-data; name="reporter" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + + +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x +Content-Disposition: form-data; name="timestamp" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +2018-03-21T18:52:18+00:00 +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x +Content-Disposition: form-data; name="comments" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +this couldn't be parsed +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x +Content-Disposition: form-data; name="attachment" +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit + +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGj +Content-Disposition: form-data; name="fruit" + +banana +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGj +Content-Disposition: form-data; name="color" + +yellow +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGj +Content-Disposition: form-data; name="cost" + +$0.12 USG +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGj +Content-Disposition: form-data; name="comments" + +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGj-- + +--kCFSwstIsIZkZtQ5JM7193kJYcK5WkyvoxsGjx5eCuVFbaeUZ9oK57JCp_p5wP86S5nY4re5x-- diff --git a/jetty-util/src/test/resources/multipart/multipart-number-browser.expected.txt b/jetty-util/src/test/resources/multipart/multipart-number-browser.expected.txt new file mode 100644 index 00000000000..ebc9f5eea84 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-number-browser.expected.txt @@ -0,0 +1,3 @@ +Content-Type|multipart/form-data; boundary="RjYiyHVV9Phv7tYylzT1f94fvTC-s7oNKwB9_Y" +Parts-Count|1 +Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 diff --git a/jetty-util/src/test/resources/multipart/multipart-number-browser.raw b/jetty-util/src/test/resources/multipart/multipart-number-browser.raw new file mode 100644 index 00000000000..11776ddfb78 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-number-browser.raw @@ -0,0 +1,5 @@ +--RjYiyHVV9Phv7tYylzT1f94fvTC-s7oNKwB9_Y +Content-Disposition: form-data; name="pi" + +3.14159265358979323846264338327950288419716939937510 +--RjYiyHVV9Phv7tYylzT1f94fvTC-s7oNKwB9_Y-- diff --git a/jetty-util/src/test/resources/multipart/multipart-number-strict.expected.txt b/jetty-util/src/test/resources/multipart/multipart-number-strict.expected.txt new file mode 100644 index 00000000000..9156fb21e2b --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-number-strict.expected.txt @@ -0,0 +1,3 @@ +Content-Type|multipart/form-data; boundary="P6Uyk-Vikfbk_NqTfVF4DwNXrIxpN451pD1" +Parts-Count|1 +Part-ContainsContents|pi|3.14159265358979323846264338327950288419716939937510 diff --git a/jetty-util/src/test/resources/multipart/multipart-number-strict.raw b/jetty-util/src/test/resources/multipart/multipart-number-strict.raw new file mode 100644 index 00000000000..5c5681665ba --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-number-strict.raw @@ -0,0 +1,7 @@ +--P6Uyk-Vikfbk_NqTfVF4DwNXrIxpN451pD1 +Content-Disposition: form-data; name="pi" +Content-Type: text/plain +Content-Transfer-Encoding: 8bit + +3.14159265358979323846264338327950288419716939937510 +--P6Uyk-Vikfbk_NqTfVF4DwNXrIxpN451pD1-- diff --git a/jetty-util/src/test/resources/multipart/multipart-sjis.expected.txt b/jetty-util/src/test/resources/multipart/multipart-sjis.expected.txt new file mode 100644 index 00000000000..35e678b66df --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-sjis.expected.txt @@ -0,0 +1,4 @@ +Content-Type|multipart/form-data; boundary="VA2isIGmYNkgC3qrrGXnlQcWO17WB3a4npVQey" +Parts-Count|2 +Part-ContainsContents|japanese|健治 +Part-ContainsContents|hello|ャユ戆タ diff --git a/jetty-util/src/test/resources/multipart/multipart-sjis.raw b/jetty-util/src/test/resources/multipart/multipart-sjis.raw new file mode 100644 index 00000000000..59e713a28b0 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-sjis.raw @@ -0,0 +1,13 @@ +--VA2isIGmYNkgC3qrrGXnlQcWO17WB3a4npVQey +Content-Disposition: form-data; name="japanese" +Content-Type: text/plain; charset=Shift_JIS +Content-Transfer-Encoding: 8bit + + +--VA2isIGmYNkgC3qrrGXnlQcWO17WB3a4npVQey +Content-Disposition: form-data; name="hello" +Content-Type: text/plain; charset=Shift_JIS +Content-Transfer-Encoding: 8bit + +?^ +--VA2isIGmYNkgC3qrrGXnlQcWO17WB3a4npVQey-- diff --git a/jetty-util/src/test/resources/multipart/multipart-strange-quoting.expected.txt b/jetty-util/src/test/resources/multipart/multipart-strange-quoting.expected.txt new file mode 100644 index 00000000000..76408aa202a --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-strange-quoting.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA" +Parts-Count|4 +Part-ContainsContents|and "I" quote|Value 1 +Part-ContainsContents|and+%22I%22+quote|Value 2 +Part-ContainsContents|value"; what="whoa"|Value 3 diff --git a/jetty-util/src/test/resources/multipart/multipart-strange-quoting.raw b/jetty-util/src/test/resources/multipart/multipart-strange-quoting.raw new file mode 100644 index 00000000000..38fa8862abc --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-strange-quoting.raw @@ -0,0 +1,26 @@ +--tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA +Content-Disposition: form-data; name="and \"I\" quote" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Value 1 +--tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA +Content-Disposition: form-data; name="and+%22I%22+quote" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Value 2 +--tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA +Content-Disposition: form-data; name="value\"; what=\"whoa\"" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Value 3 +--tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA +Content-Disposition: form-data; name="other\"; +what=\"Something\"" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Value 4 +--tR61vgdxSzzv2FDycET2lt-OUZ1IW1GqA-- diff --git a/jetty-util/src/test/resources/multipart/multipart-text-files.expected.txt b/jetty-util/src/test/resources/multipart/multipart-text-files.expected.txt new file mode 100644 index 00000000000..82fe6e3a904 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-text-files.expected.txt @@ -0,0 +1,9 @@ +Content-Type|multipart/form-data; boundary="ny9C5eIZL7fsfPY9ONPy8Lxb6tkgEv1" +Parts-Count|3 +Part-ContainsContents|text|text default +Part-ContainsContents|file1|Content of a.txt +Part-ContainsContents|file2|Content of a.html +Part-Filename|file1|a.txt +Part-Filename|file2|a.html +Part-Sha1sum|file1|588A0F273CB5AFE9C8D76DD081812E672F2061E2 +Part-Sha1sum|file2|9A9005159AB90A6D2D9BACB5414EFE932F0CED85 \ No newline at end of file diff --git a/jetty-util/src/test/resources/multipart/multipart-text-files.raw b/jetty-util/src/test/resources/multipart/multipart-text-files.raw new file mode 100644 index 00000000000..c72d60aaea1 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-text-files.raw @@ -0,0 +1,23 @@ +--ny9C5eIZL7fsfPY9ONPy8Lxb6tkgEv1 +Content-Disposition: form-data; name="text" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +text default + +--ny9C5eIZL7fsfPY9ONPy8Lxb6tkgEv1 +Content-Type: text/plain; charset=UTF-8 +X-SHA1: 588A0F273CB5AFE9C8D76DD081812E672F2061E2 +Content-Disposition: form-data; name="file1"; filename="a.txt" +Content-Transfer-Encoding: binary + +Content of a.txt + +--ny9C5eIZL7fsfPY9ONPy8Lxb6tkgEv1 +Content-Type: text/html; charset=UTF-8 +X-SHA1: 9A9005159AB90A6D2D9BACB5414EFE932F0CED85 +Content-Disposition: form-data; name="file2"; filename="a.html" +Content-Transfer-Encoding: binary + +<!DOCTYPE html><title>Content of a.html. +--ny9C5eIZL7fsfPY9ONPy8Lxb6tkgEv1-- diff --git a/jetty-util/src/test/resources/multipart/multipart-unicode-names.expected.txt b/jetty-util/src/test/resources/multipart/multipart-unicode-names.expected.txt new file mode 100644 index 00000000000..2c15cb6f6b4 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-unicode-names.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="1R40qTSaEjDJPcArQiccT7vdpp0l02248R" +Parts-Count|2 +Part-ContainsContents|こんにちは世界|Greetings 1 +Part-ContainsContents|%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C|Greetings 2 + diff --git a/jetty-util/src/test/resources/multipart/multipart-unicode-names.raw b/jetty-util/src/test/resources/multipart/multipart-unicode-names.raw new file mode 100644 index 00000000000..5afab43ef54 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-unicode-names.raw @@ -0,0 +1,13 @@ +--1R40qTSaEjDJPcArQiccT7vdpp0l02248R +Content-Disposition: form-data; name="こんにちは世界" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Greetings 1 +--1R40qTSaEjDJPcArQiccT7vdpp0l02248R +Content-Disposition: form-data; name="%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C" +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Greetings 2 +--1R40qTSaEjDJPcArQiccT7vdpp0l02248R-- diff --git a/jetty-util/src/test/resources/multipart/multipart-uppercase.expected.txt b/jetty-util/src/test/resources/multipart/multipart-uppercase.expected.txt new file mode 100644 index 00000000000..ef8470f4cc7 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-uppercase.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ" +Parts-Count|2 +Part-ContainsContents|STATE|TEXAS +Part-ContainsContents|CITY|AUSTIN + diff --git a/jetty-util/src/test/resources/multipart/multipart-uppercase.raw b/jetty-util/src/test/resources/multipart/multipart-uppercase.raw new file mode 100644 index 00000000000..3aecb111bc7 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-uppercase.raw @@ -0,0 +1,13 @@ +--8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ +CONTENT-DISPOSITION: FORM-DATA; NAME="STATE" +CONTENT-TYPE: TEXT/PLAIN; CHARSET=WINDOWS-1252 +CONTENT-TRANSFER-ENCODING: 8BIT + +TEXAS +--8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ +CONTENT-DISPOSITION: FORM-DATA; NAME="CITY" +CONTENT-TYPE: TEXT/PLAIN; CHARSET=WINDOWS-1252 +CONTENT-TRANSFER-ENCODING: 8BIT + +AUSTIN +--8Q4MHJ3LWIQEQQ_OXYU5U9ZLYEH60_CFZQYANCZ-- diff --git a/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.expected.txt b/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.expected.txt new file mode 100644 index 00000000000..e1863757719 --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.expected.txt @@ -0,0 +1,5 @@ +Content-Type|multipart/form-data; boundary="qjIkwQOhaYfC2VEcL5j-9sjEK1FIsYMd5" +Parts-Count|1 +Part-ContainsContents|company|bob & frank's shoe repair + + diff --git a/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.raw b/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.raw new file mode 100644 index 00000000000..994b267b26c --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-x-www-form-urlencoded.raw @@ -0,0 +1,7 @@ +--qjIkwQOhaYfC2VEcL5j-9sjEK1FIsYMd5 +Content-Disposition: form-data; name="company" +Content-Type: application/x-www-form-urlencoded; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +bob+%26+frank%27s+shoe+repair +--qjIkwQOhaYfC2VEcL5j-9sjEK1FIsYMd5-- diff --git a/jetty-util/src/test/resources/multipart/multipart-zencoding.expected.txt b/jetty-util/src/test/resources/multipart/multipart-zencoding.expected.txt new file mode 100644 index 00000000000..fda05113c8f --- /dev/null +++ b/jetty-util/src/test/resources/multipart/multipart-zencoding.expected.txt @@ -0,0 +1,8 @@ +Content-Type|multipart/form-data; boundary="UuAU1liVuDVE7wfJUYE72PUF9DZafZ" +Parts-Count|4 +Part-ContainsContents|zalgo-8|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ +Part-ContainsContents|zalgo-16|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ +Part-ContainsContents|zalgo-16-be|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ +Part-ContainsContents|zalgo-16-le|y͔͕͍o̪̞͎̥͇̤̕u'̛̰̫̳̰v̧̘̪̠̟̟e̥͈̱ ̥̠͇͎͕̜s̤e̺e̙ͅņ̜ ̲̟͝za̴͖̱̲͈̘l͖̖͓̙̮͔g͕̞͖͘o͕̤͈̗ ̯̲̹̲͓b͙͟e̞͎̜̗͈͉̭͞f̸or̰̩e̡̝̺,̸͕̙̥̼͇̜ ̪͇̹r̘̪ͅị͔̥͈ͅg̠̟̯͖̦͇ht͖̪͍͚̖͡?͙̝͖̞ + + diff --git a/jetty-util/src/test/resources/multipart/multipart-zencoding.raw b/jetty-util/src/test/resources/multipart/multipart-zencoding.raw new file mode 100644 index 0000000000000000000000000000000000000000..74d78b79fb5014723b7ed76f18238d714597fc57 GIT binary patch literal 1830 zcmeH{Pfrt36vbb1c1^leBqEN85|I(BMoQHXl>!`{U zPxi;#&fH9PwRa9!nSpTVs^n#axcpf_^4N`Jkt>dX9yQy5KRaFg5d|D3McDP$H{# zp`?plC|Oy75@|&!+4mPHkx@}r_=-?6TZR%X{H+Q~_9;UNpRP(1IE=ec^4%&ZK`8mx SQGpU2Y8OiUo=VdUhrR=F$o@_M literal 0 HcmV?d00001