blob: 643df32ffd60c4a6fd31da8c1a67aed8d3fea6ea [file] [log] [blame]
/*******************************************************************************
* 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();
}
}
}
}