package com.firefly.server.http2.router.handler.body;
import com.firefly.codec.http2.encode.UrlEncoded;
import com.firefly.codec.http2.model.MultiPartInputStreamParser;
import com.firefly.server.http2.router.spi.HTTPBodyHandlerSPI;
import com.firefly.utils.io.IO;
import com.firefly.utils.io.PipedStream;
import com.firefly.utils.json.Json;
import com.firefly.utils.json.JsonArray;
import com.firefly.utils.json.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.Part;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* @author Pengtao Qiu
*/
public class HTTPBodyHandlerSPIImpl implements HTTPBodyHandlerSPI {
private static final Logger log = LoggerFactory.getLogger("firefly-system");
PipedStream pipedStream;
MultiPartInputStreamParser multiPartInputStreamParser;
UrlEncoded urlEncodedMap;
String charset;
private BufferedReader bufferedReader;
private String stringBody;
@Override
public String getParameter(String name) {
return urlEncodedMap.getString(name);
}
@Override
public List<String> getParameterValues(String name) {
return urlEncodedMap.getValues(name);
}
@Override
public Map<String, List<String>> getParameterMap() {
return urlEncodedMap;
}
@Override
public Collection<Part> getParts() {
if (multiPartInputStreamParser == null) {
return null;
} else {
try {
return multiPartInputStreamParser.getParts();
} catch (IOException e) {
log.error("get multi part exception", e);
return null;
}
}
}
@Override
public Part getPart(String name) {
if (multiPartInputStreamParser == null) {
return null;
} else {
try {
return multiPartInputStreamParser.getPart(name);
} catch (IOException e) {
log.error("get multi part exception", e);
return null;
}
}
}
@Override
public InputStream getInputStream() {
if (pipedStream == null) {
return null;
} else {
try {
return pipedStream.getInputStream();
} catch (IOException e) {
log.error("get input stream exception", e);
return null;
}
}
}
@Override
public BufferedReader getBufferedReader() {
if (bufferedReader != null) {
return bufferedReader;
} else {
if (pipedStream == null) {
return null;
} else {
try {
bufferedReader = new BufferedReader(new InputStreamReader(pipedStream.getInputStream()));
return bufferedReader;
} catch (IOException e) {
log.error("get buffered reader exception", e);
return null;
}
}
}
}
@Override
public String getStringBody(String charset) {
if (stringBody != null) {
return stringBody;
} else {
if (getInputStream() == null) {
return null;
} else {
try (InputStream inputStream = getInputStream()) {
stringBody = IO.toString(inputStream, Charset.forName(charset));
return stringBody;
} catch (IOException e) {
log.error("get string body exception", e);
return null;
}
}
}
}
@Override
public String getStringBody() {
return getStringBody(charset);
}
@Override
public <T> T getJsonBody(Class<T> clazz) {
return Json.toObject(getStringBody(), clazz);
}
@Override
public JsonObject getJsonObjectBody() {
return Json.toJsonObject(getStringBody());
}
@Override
public JsonArray getJsonArrayBody() {
return Json.toJsonArray(getStringBody());
}
}