PageRenderTime 26ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/spring-web/src/test/java/org/springframework/web/client/AbstractJettyServerTestCase.java

https://gitlab.com/yinxiaoling/spring-framework
Java | 336 lines | 247 code | 67 blank | 22 comment | 4 complexity | e058e183c534102664ae44e9404f9a60 MD5 | raw file
  1. /*
  2. * Copyright 2002-2015 the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.springframework.web.client;
  17. import java.io.IOException;
  18. import java.util.Collections;
  19. import java.util.List;
  20. import java.util.Map;
  21. import javax.servlet.GenericServlet;
  22. import javax.servlet.ServletException;
  23. import javax.servlet.ServletRequest;
  24. import javax.servlet.ServletResponse;
  25. import javax.servlet.http.HttpServlet;
  26. import javax.servlet.http.HttpServletRequest;
  27. import javax.servlet.http.HttpServletResponse;
  28. import org.apache.commons.fileupload.FileItem;
  29. import org.apache.commons.fileupload.FileItemFactory;
  30. import org.apache.commons.fileupload.FileUploadException;
  31. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  32. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  33. import org.eclipse.jetty.server.Connector;
  34. import org.eclipse.jetty.server.NetworkConnector;
  35. import org.eclipse.jetty.server.Server;
  36. import org.eclipse.jetty.servlet.ServletContextHandler;
  37. import org.eclipse.jetty.servlet.ServletHolder;
  38. import org.junit.AfterClass;
  39. import org.junit.BeforeClass;
  40. import org.springframework.http.MediaType;
  41. import org.springframework.util.FileCopyUtils;
  42. import static org.junit.Assert.*;
  43. /**
  44. * @author Arjen Poutsma
  45. * @author Sam Brannen
  46. */
  47. public class AbstractJettyServerTestCase {
  48. protected static final String helloWorld = "H\u00e9llo W\u00f6rld";
  49. protected static final MediaType textContentType = new MediaType("text", "plain",
  50. Collections.singletonMap("charset", "UTF-8"));
  51. protected static final MediaType jsonContentType = new MediaType("application",
  52. "json", Collections.singletonMap("charset", "utf-8"));
  53. private static Server jettyServer;
  54. protected static int port;
  55. protected static String baseUrl;
  56. @BeforeClass
  57. public static void startJettyServer() throws Exception {
  58. // Let server pick its own random, available port.
  59. jettyServer = new Server(0);
  60. ServletContextHandler handler = new ServletContextHandler();
  61. byte[] bytes = helloWorld.getBytes("utf-8");
  62. handler.addServlet(new ServletHolder(new GetServlet(bytes, textContentType)), "/get");
  63. handler.addServlet(new ServletHolder(new GetServlet(new byte[0], textContentType)), "/get/nothing");
  64. handler.addServlet(new ServletHolder(new GetServlet(bytes, null)), "/get/nocontenttype");
  65. handler.addServlet(
  66. new ServletHolder(new PostServlet(helloWorld, "/post/1", bytes, textContentType)),
  67. "/post");
  68. handler.addServlet(
  69. new ServletHolder(new JsonPostServlet("/jsonpost/1", jsonContentType)),
  70. "/jsonpost");
  71. handler.addServlet(new ServletHolder(new StatusCodeServlet(204)), "/status/nocontent");
  72. handler.addServlet(new ServletHolder(new StatusCodeServlet(304)), "/status/notmodified");
  73. handler.addServlet(new ServletHolder(new ErrorServlet(404)), "/status/notfound");
  74. handler.addServlet(new ServletHolder(new ErrorServlet(500)), "/status/server");
  75. handler.addServlet(new ServletHolder(new UriServlet()), "/uri/*");
  76. handler.addServlet(new ServletHolder(new MultipartServlet()), "/multipart");
  77. handler.addServlet(new ServletHolder(new FormServlet()), "/form");
  78. handler.addServlet(new ServletHolder(new DeleteServlet()), "/delete");
  79. handler.addServlet(
  80. new ServletHolder(new PutServlet(helloWorld, bytes, textContentType)),
  81. "/put");
  82. jettyServer.setHandler(handler);
  83. jettyServer.start();
  84. Connector[] connectors = jettyServer.getConnectors();
  85. NetworkConnector connector = (NetworkConnector) connectors[0];
  86. port = connector.getLocalPort();
  87. baseUrl = "http://localhost:" + port;
  88. }
  89. @AfterClass
  90. public static void stopJettyServer() throws Exception {
  91. if (jettyServer != null) {
  92. jettyServer.stop();
  93. }
  94. }
  95. /** Servlet that sets the given status code. */
  96. @SuppressWarnings("serial")
  97. private static class StatusCodeServlet extends GenericServlet {
  98. private final int sc;
  99. private StatusCodeServlet(int sc) {
  100. this.sc = sc;
  101. }
  102. @Override
  103. public void service(ServletRequest request, ServletResponse response) throws
  104. ServletException, IOException {
  105. ((HttpServletResponse) response).setStatus(sc);
  106. }
  107. }
  108. /** Servlet that returns an error message for a given status code. */
  109. @SuppressWarnings("serial")
  110. private static class ErrorServlet extends GenericServlet {
  111. private final int sc;
  112. private ErrorServlet(int sc) {
  113. this.sc = sc;
  114. }
  115. @Override
  116. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  117. ((HttpServletResponse) response).sendError(sc);
  118. }
  119. }
  120. @SuppressWarnings("serial")
  121. private static class GetServlet extends HttpServlet {
  122. private final byte[] buf;
  123. private final MediaType contentType;
  124. private GetServlet(byte[] buf, MediaType contentType) {
  125. this.buf = buf;
  126. this.contentType = contentType;
  127. }
  128. @Override
  129. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  130. throws ServletException, IOException {
  131. if (contentType != null) {
  132. response.setContentType(contentType.toString());
  133. }
  134. response.setContentLength(buf.length);
  135. FileCopyUtils.copy(buf, response.getOutputStream());
  136. }
  137. }
  138. @SuppressWarnings("serial")
  139. private static class PostServlet extends HttpServlet {
  140. private final String s;
  141. private final String location;
  142. private final byte[] buf;
  143. private final MediaType contentType;
  144. private PostServlet(String s, String location, byte[] buf, MediaType contentType) {
  145. this.s = s;
  146. this.location = location;
  147. this.buf = buf;
  148. this.contentType = contentType;
  149. }
  150. @Override
  151. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  152. throws ServletException, IOException {
  153. assertTrue("Invalid request content-length", request.getContentLength() > 0);
  154. assertNotNull("No content-type", request.getContentType());
  155. String body = FileCopyUtils.copyToString(request.getReader());
  156. assertEquals("Invalid request body", s, body);
  157. response.setStatus(HttpServletResponse.SC_CREATED);
  158. response.setHeader("Location", baseUrl + location);
  159. response.setContentLength(buf.length);
  160. response.setContentType(contentType.toString());
  161. FileCopyUtils.copy(buf, response.getOutputStream());
  162. }
  163. }
  164. @SuppressWarnings("serial")
  165. private static class JsonPostServlet extends HttpServlet {
  166. private final String location;
  167. private final MediaType contentType;
  168. private JsonPostServlet(String location, MediaType contentType) {
  169. this.location = location;
  170. this.contentType = contentType;
  171. }
  172. @Override
  173. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  174. throws ServletException, IOException {
  175. assertTrue("Invalid request content-length", request.getContentLength() > 0);
  176. assertNotNull("No content-type", request.getContentType());
  177. String body = FileCopyUtils.copyToString(request.getReader());
  178. response.setStatus(HttpServletResponse.SC_CREATED);
  179. response.setHeader("Location", baseUrl +location);
  180. response.setContentType(contentType.toString());
  181. byte[] bytes = body.getBytes("utf-8");
  182. response.setContentLength(bytes.length);;
  183. FileCopyUtils.copy(bytes, response.getOutputStream());
  184. }
  185. }
  186. @SuppressWarnings("serial")
  187. private static class PutServlet extends HttpServlet {
  188. private final String s;
  189. private PutServlet(String s, byte[] buf, MediaType contentType) {
  190. this.s = s;
  191. }
  192. @Override
  193. protected void doPut(HttpServletRequest request, HttpServletResponse response)
  194. throws ServletException, IOException {
  195. assertTrue("Invalid request content-length", request.getContentLength() > 0);
  196. assertNotNull("No content-type", request.getContentType());
  197. String body = FileCopyUtils.copyToString(request.getReader());
  198. assertEquals("Invalid request body", s, body);
  199. response.setStatus(HttpServletResponse.SC_ACCEPTED);
  200. }
  201. }
  202. @SuppressWarnings("serial")
  203. private static class UriServlet extends HttpServlet {
  204. @Override
  205. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  206. resp.setContentType("text/plain");
  207. resp.setCharacterEncoding("utf-8");
  208. resp.getWriter().write(req.getRequestURI());
  209. }
  210. }
  211. @SuppressWarnings("serial")
  212. private static class MultipartServlet extends HttpServlet {
  213. @Override
  214. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  215. assertTrue(ServletFileUpload.isMultipartContent(req));
  216. FileItemFactory factory = new DiskFileItemFactory();
  217. ServletFileUpload upload = new ServletFileUpload(factory);
  218. try {
  219. List<FileItem> items = upload.parseRequest(req);
  220. assertEquals(4, items.size());
  221. FileItem item = items.get(0);
  222. assertTrue(item.isFormField());
  223. assertEquals("name 1", item.getFieldName());
  224. assertEquals("value 1", item.getString());
  225. item = items.get(1);
  226. assertTrue(item.isFormField());
  227. assertEquals("name 2", item.getFieldName());
  228. assertEquals("value 2+1", item.getString());
  229. item = items.get(2);
  230. assertTrue(item.isFormField());
  231. assertEquals("name 2", item.getFieldName());
  232. assertEquals("value 2+2", item.getString());
  233. item = items.get(3);
  234. assertFalse(item.isFormField());
  235. assertEquals("logo", item.getFieldName());
  236. assertEquals("logo.jpg", item.getName());
  237. assertEquals("image/jpeg", item.getContentType());
  238. }
  239. catch (FileUploadException ex) {
  240. throw new ServletException(ex);
  241. }
  242. }
  243. }
  244. @SuppressWarnings("serial")
  245. private static class FormServlet extends HttpServlet {
  246. @Override
  247. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  248. assertEquals(MediaType.APPLICATION_FORM_URLENCODED_VALUE,
  249. req.getContentType());
  250. Map<String, String[]> parameters = req.getParameterMap();
  251. assertEquals(2, parameters.size());
  252. String[] values = parameters.get("name 1");
  253. assertEquals(1, values.length);
  254. assertEquals("value 1", values[0]);
  255. values = parameters.get("name 2");
  256. assertEquals(2, values.length);
  257. assertEquals("value 2+1", values[0]);
  258. assertEquals("value 2+2", values[1]);
  259. }
  260. }
  261. @SuppressWarnings("serial")
  262. private static class DeleteServlet extends HttpServlet {
  263. @Override
  264. protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
  265. throws ServletException, IOException {
  266. resp.setStatus(200);
  267. }
  268. }
  269. }