// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package jodd.http;
import jodd.io.StreamUtil;
import jodd.util.StringPool;
import jodd.util.StringUtil;
import org.apache.catalina.core.ApplicationPart;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.servlet.http.Cookie;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class EchoServlet extends HttpServlet {
public static Data ref;
public static void testinit() {
ref = new Data();
}
public static class Data {
public boolean get;
public boolean post;
public String queryString;
public String body;
public Map<String, String> header;
public Map<String, String> params;
public Map<String, String> parts;
public Map<String, String> fileNames;
public Cookie[] cookies;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ref.get = true;
ref.post = false;
readAll(req);
if (ref.cookies != null) {
for (Cookie cookie : ref.cookies) {
cookie.setValue(cookie.getValue() + "!");
resp.addCookie(cookie);
}
}
write(resp, ref.body);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ref.post = true;
ref.get = false;
readAll(req);
write(resp, ref.body);
}
// ---------------------------------------------------------------- write
protected void write(HttpServletResponse resp, String text) throws IOException {
if (text != null) {
resp.setContentLength(text.getBytes(StringPool.UTF_8).length);
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write(text);
resp.flushBuffer();
}
}
// ---------------------------------------------------------------- read all
protected void readAll(HttpServletRequest req) throws IOException {
ref.body = readRequestBody(req);
ref.queryString = req.getQueryString();
ref.header = copyHeaders(req);
ref.cookies = req.getCookies();
}
protected String readRequestBody(HttpServletRequest request) throws IOException {
BufferedReader buff = request.getReader();
StringWriter out = new StringWriter();
StreamUtil.copy(buff, out);
return out.toString();
}
protected Map<String, String> copyHeaders(HttpServletRequest req) {
Enumeration enumeration = req.getHeaderNames();
Map<String, String> header = new HashMap<>();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
String value = req.getHeader(name);
header.put(name, value);
}
return header;
}
protected Map<String, String> copyParams(HttpServletRequest req) {
String charset = req.getParameter("enc");
Enumeration enumeration = req.getParameterNames();
Map<String, String> params = new HashMap<>();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
String value = req.getParameter(name);
if (charset != null) {
value = StringUtil.convertCharset(value, StringPool.ISO_8859_1, charset);
}
params.put(name, value);
}
return params;
}
protected Map<String, String> copyParts(HttpServletRequest req) {
Map<String, String> parts = new HashMap<>();
if (req.getContentType() != null && !req.getContentType().toLowerCase().contains("multipart/form-data")) {
return parts;
}
String enc = "UTF-8";
try {
Collection<Part> prs = req.getParts();
for (Part p : prs) {
parts.put(p.getName(), new String(StreamUtil.readBytes(p.getInputStream()), enc));
}
}
catch (IOException e) {
e.printStackTrace();
}
catch (ServletException e) {
e.printStackTrace();
}
return parts;
}
protected Map<String, String> copyFileName(HttpServletRequest req) {
Map<String, String> parts = new HashMap<>();
if (req.getContentType() != null && !req.getContentType().toLowerCase().contains("multipart/form-data")) {
return parts;
}
try {
Collection<Part> prs = req.getParts();
for (Part p : prs) {
if (p instanceof ApplicationPart) {
ApplicationPart ap = (ApplicationPart) p;
parts.put(p.getName(), ap.getSubmittedFileName());
}
}
}
catch (IOException e) {
e.printStackTrace();
}
catch (ServletException e) {
e.printStackTrace();
}
return parts;
}
}