/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gws.stubs; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @SuppressWarnings("unused") //API public class MultiPartServer { private Server server; List<MultiPartItem> responseItems; String requestBody; int responseStatus = HttpServletResponse.SC_OK; Map<String, String[]> parameterMap; Map<String, List<String>> headerMap; Exception fail; public void start(int port) throws Exception { server = new Server(new InetSocketAddress("127.0.0.1", port)); server.setHandler(new AbstractHandler() { @Override public void handle( String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { headerMap = new LinkedHashMap<String, List<String>>(); Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); List<String> values = new ArrayList<String>(); final Enumeration<String> headers = request.getHeaders(headerName); while (headers.hasMoreElements()) { values.add(headers.nextElement()); } headerMap.put(headerName, values); } parameterMap = request.getParameterMap(); requestBody = Streams.toString(baseRequest.getInputStream(), request.getCharacterEncoding()); response.setStatus(responseStatus); String boundary = "uuid:" + UUID.randomUUID(); ServletOutputStream out = response.getOutputStream(); response.setContentType("multipart/related; type=\"text/xml\"; boundary=\"" + boundary + "\""); for (MultiPartItem item : responseItems) { out.println("\n--" + boundary); for (Map.Entry<String, String> e : item.headers.entrySet()) { out.println(e.getKey() + ": " + e.getValue()); } out.println(); out.write(item.content); } out.println("\n--" + boundary + "--"); out.flush(); out.close(); baseRequest.setHandled(true); fail = null; } catch (IOException e) { e.printStackTrace(System.err); fail = e; throw e; } catch (Exception e) { e.printStackTrace(System.err); fail = e; throw new ServletException(e); } } }); server.start(); } public void stop() throws Exception { server.stop(); } public Map<String, String[]> getParameterMap() { return parameterMap; } public Map<String, List<String>> getHeaderMap() { return headerMap; } public String getRequestBody() { return requestBody; } public void setResponseStatus(int status) { responseStatus = status; } public Exception getFail() { return fail; } public void setResponseItems(List<MultiPartItem> responseItems) { this.responseItems = responseItems; } }