This commit is contained in:
wentch
2016-01-18 15:29:38 +08:00
parent c6057ba211
commit d741c41b67
2 changed files with 17 additions and 53 deletions

View File

@@ -260,14 +260,18 @@ public class HttpRequest extends Request<HttpContext> {
+ ", host:" + this.host + ", params:" + this.params + ", header:" + this.header + "}"; + ", host:" + this.host + ", params:" + this.params + ", header:" + this.header + "}";
} }
public final Iterable<MultiPart> multiParts() throws IOException {
return getMultiContext().parts();
}
public final MultiContext getMultiContext() { public final MultiContext getMultiContext() {
return new MultiContext(context.getCharset(), this.getContentType(), return new MultiContext(context.getCharset(), this.getContentType(), this.params,
new BufferedInputStream(Channels.newInputStream(this.channel), Math.max(array.count(), 8192)) { new BufferedInputStream(Channels.newInputStream(this.channel), Math.max(array.count(), 8192)) {
{ {
array.write(this.buf); array.write(this.buf);
this.count = array.count(); this.count = array.count();
} }
}); }, null);
} }
@Override @Override

View File

@@ -12,10 +12,13 @@ import java.util.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.logging.*; import java.util.logging.*;
import java.util.regex.*; import java.util.regex.*;
import org.redkale.util.AnyValue.DefaultAnyValue;
/** /**
* *
* <p> 详情见: http://www.redkale.org * <p>
* 详情见: http://www.redkale.org
*
* @author zhangjx * @author zhangjx
*/ */
public final class MultiContext { public final class MultiContext {
@@ -36,7 +39,7 @@ public final class MultiContext {
private final ByteArray buf = new ByteArray(64); private final ByteArray buf = new ByteArray(64);
private final Map<String, String> parameters = new HashMap<>(); private final DefaultAnyValue parameters;
private final Pattern fielnamePattern; private final Pattern fielnamePattern;
@@ -53,58 +56,16 @@ public final class MultiContext {
} }
}; };
public MultiContext(final String contentType, final InputStream in) { public MultiContext(final Charset charsetName, final String contentType, final DefaultAnyValue params, final InputStream in, String fielnameRegex) {
this(null, contentType, in);
}
public MultiContext(final Charset charsetName, final String contentType, final InputStream in) {
this(charsetName, contentType, in, null);
}
public MultiContext(final String contentType, final InputStream in, String extregex) {
this(null, contentType, in, extregex);
}
public MultiContext(final Charset charsetName, final String contentType, final InputStream in, String fielnameRegex) {
this.charset = charsetName == null ? UTF8 : charsetName; this.charset = charsetName == null ? UTF8 : charsetName;
this.contentType = contentType.trim(); this.contentType = contentType.trim();
this.parameters = params;
this.boundary = parseBoundary(this.contentType); this.boundary = parseBoundary(this.contentType);
this.endboundarray = ("--" + this.boundary + "--").getBytes(); this.endboundarray = ("--" + this.boundary + "--").getBytes();
this.in = in instanceof BufferedInputStream ? in : new BufferedInputStream(in); this.in = in instanceof BufferedInputStream ? in : new BufferedInputStream(in);
this.fielnamePattern = fielnameRegex == null || fielnameRegex.isEmpty() ? null : Pattern.compile(fielnameRegex); this.fielnamePattern = fielnameRegex == null || fielnameRegex.isEmpty() ? null : Pattern.compile(fielnameRegex);
} }
public Map<String, String> getParameters() {
return parameters;
}
public String getParameter(String name) {
return getParameters().get(name);
}
public final String getParameter(String name, String defaultValue) {
String value = this.getParameter(name);
return value == null ? defaultValue : value;
}
public final int getIntParameter(String name, int defaultValue) {
String value = this.getParameter(name);
try {
return value == null ? defaultValue : Integer.decode(value);
} catch (NumberFormatException e) {
return defaultValue;
}
}
public final long getLongParameter(String name, long defaultValue) {
String value = this.getParameter(name);
try {
return value == null ? defaultValue : Long.decode(value);
} catch (NumberFormatException e) {
return defaultValue;
}
}
private String parseBoundary(String contentType) { private String parseBoundary(String contentType) {
if (!contentType.startsWith("multipart/")) { if (!contentType.startsWith("multipart/")) {
return null; return null;
@@ -120,16 +81,15 @@ public final class MultiContext {
return this.boundary != null; return this.boundary != null;
} }
public Iterable<MultiPart> listMultiPart() throws IOException { public Iterable<MultiPart> parts() throws IOException {
if (!isMultipart()) return emptyIterable; if (!isMultipart()) return emptyIterable;
final boolean debug = true;
final String boundarystr = "--" + this.boundary; final String boundarystr = "--" + this.boundary;
final Pattern fielnameReg = this.fielnamePattern; final Pattern fielnameReg = this.fielnamePattern;
final String endboundary = boundarystr + "--"; final String endboundary = boundarystr + "--";
final byte[] boundarray = ("\n" + boundarystr).getBytes(); final byte[] boundarray = ("\n" + boundarystr).getBytes();
final byte[] buffer = new byte[boundarray.length]; final byte[] buffer = new byte[boundarray.length];
final InputStream input = this.in; final InputStream input = this.in;
final Map<String, String> params = this.parameters; final DefaultAnyValue params = this.parameters;
final AtomicBoolean finaled = new AtomicBoolean(false); final AtomicBoolean finaled = new AtomicBoolean(false);
return () -> new Iterator<MultiPart>() { return () -> new Iterator<MultiPart>() {
@@ -225,13 +185,13 @@ public final class MultiContext {
return true; return true;
} else { //不是文件 } else { //不是文件
readLine(); //读掉空白 readLine(); //读掉空白
params.put(parseValue(disposition, "name"), readLine()); params.addValue(parseValue(disposition, "name"), readLine());
this.boundaryline = null; this.boundaryline = null;
this.lastentry = null; this.lastentry = null;
return this.hasNext(); return this.hasNext();
} }
} catch (IOException ex) { } catch (IOException ex) {
logger.log(Level.FINER, "listMultiPart abort", ex); logger.log(Level.FINER, "list multiparts abort", ex);
return false; return false;
} }
} }