| /******************************************************************************* |
| * Copyright (c) 2010-2014 SAP AG and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.skalli.testutil; |
| |
| import java.io.BufferedReader; |
| import java.io.DataOutputStream; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.net.ServerSocket; |
| import java.net.Socket; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.commons.io.IOUtils; |
| import org.apache.commons.lang.StringUtils; |
| |
| @SuppressWarnings("nls") |
| public class HttpServerMock implements Runnable { |
| |
| private String host = "localhost"; |
| private int port = 12421; // just an arbitrary port |
| private Thread t; |
| private Map<String, String> bodies = new HashMap<String, String>(); |
| private ServerSocket server; |
| |
| public HttpServerMock() { |
| String systemPropertyHost = System.getProperty("httpservermock.host"); |
| if (StringUtils.isNotBlank(systemPropertyHost)) { |
| this.host = systemPropertyHost; |
| } |
| String sytemPropertyPort = System.getProperty("httpservermock.port"); |
| if (StringUtils.isNotBlank(sytemPropertyPort) && StringUtils.isNumeric(sytemPropertyPort)) { |
| this.port = Integer.valueOf(sytemPropertyPort); |
| } |
| } |
| |
| public HttpServerMock(Map<String, String> map) { |
| this(); |
| for (String contentId : map.keySet()) { |
| addContent(contentId, map.get(contentId)); |
| } |
| } |
| |
| public void addContent(String contentId, String content) { |
| synchronized (bodies) { |
| bodies.put(contentId, content); |
| } |
| } |
| |
| public String getHost() { |
| return host; |
| } |
| |
| public int getPort() { |
| return port; |
| } |
| |
| public void start() { |
| if (t != null) { |
| return; |
| } |
| t = new Thread(this); |
| t.start(); |
| } |
| |
| public void stop() { |
| if (t == null) { |
| return; |
| } |
| try { |
| synchronized (server) { |
| server.close(); |
| } |
| t.interrupt(); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| @Override |
| public void run() { |
| BufferedReader request = null; |
| DataOutputStream response = null; |
| try { |
| server = new ServerSocket(port); |
| while (true) { |
| Socket connection = server.accept(); |
| |
| request = new BufferedReader(new InputStreamReader(connection.getInputStream(), "ISO8859_1")); |
| response = new DataOutputStream(connection.getOutputStream()); |
| |
| String httpCode; |
| String contentId = ""; |
| String requestLine = request.readLine(); |
| |
| if (!StringUtils.startsWithIgnoreCase(requestLine, "GET")) { |
| httpCode = "405"; |
| } else { |
| String path = StringUtils.split(requestLine, " ")[1]; |
| int n = StringUtils.lastIndexOf(path, "/"); |
| contentId = StringUtils.substring(path, 1, n); |
| httpCode = StringUtils.substring(path, n + 1); |
| } |
| |
| String content = bodies.get(contentId); |
| StringBuffer sb = new StringBuffer(); |
| sb.append("HTTP/1.1 ").append(httpCode).append(" CustomStatus\r\n"); |
| sb.append("Server: MiniMockUnitServer\r\n"); |
| sb.append("Content-Type: text/plain\r\n"); |
| if (content != null) { |
| sb.append("Content-Length: ").append(content.length()).append("\r\n"); |
| } |
| sb.append("Connection: close\r\n"); |
| sb.append("\r\n"); |
| if (content != null) { |
| sb.append(content); |
| } |
| |
| response.writeBytes(sb.toString()); |
| IOUtils.closeQuietly(response); |
| } |
| } catch (IOException e) { |
| IOUtils.closeQuietly(request); |
| IOUtils.closeQuietly(response); |
| } finally { |
| try { |
| server.close(); |
| } catch (IOException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |