package oneapi.test;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class OneAPIServerSimulator implements Runnable {
private int port = 8080;
private boolean running = true;
private ServerSocket server;
private List<String> requests = new ArrayList<String>();
private String postRequest;
private String response = "dummy response";
public OneAPIServerSimulator( int port ) {
this.port = port;
}
@Override
public void run() {
try {
if ( server == null)
server = new ServerSocket( this.port );
while ( running ) {
Socket connection = null;
try {
connection = server.accept();
// get request from client
String request = getRequest( connection );
requests.add( request );
// get content (POST request)
int postlen = parseContentLength(request);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
char[] posted = new char[postlen];
in.read(posted, 0, postlen);
postRequest = new String(posted);
System.out.println(postRequest);
// return response to client
OutputStream out = new BufferedOutputStream( connection.getOutputStream() );
if (request.startsWith("POST")) {
//out.write("HTTP/1.1 201 OK\r\nConnection: close\r\n\r\n".getBytes());
out.write("HTTP/1.1 201 OK\r\nContent-Type: application/json;charset=UTF-8\r\nConnection: close\r\n\r\n".getBytes());
} else if (request.startsWith("GET")) {
out.write("HTTP/1.1 200 OK\r\nContent-Type: application/json;charset=UTF-8\r\nConnection: close\r\n\r\n".getBytes());
} else if (request.startsWith("DELETE")) {
out.write("HTTP/1.1 204 OK\r\nConnection: close\r\n\r\n".getBytes());
}
out.write(response.getBytes());
out.flush( );
in.close();
}
catch ( IOException ex ) {
if ( server.isClosed() == false ) {
ex.printStackTrace();
}
}
finally {
if ( connection != null ) {
connection.close();
}
}
}
}
catch ( IOException e ) {
System.err.println( "Could not start server: " + e.getMessage() );
}
}
private int parseContentLength(String request) {
int position = request.indexOf("Content-Length:");
if ( position == -1) {
return 0;
}
String contentLength = request.substring(position);
contentLength = contentLength.split(" ")[1];
contentLength = contentLength.split("\r\n")[0];
return Integer.valueOf(contentLength);
}
private String getRequest( Socket connection ) throws IOException {
InputStream in = connection.getInputStream();
StringBuilder request = new StringBuilder();
int i;
while( ( i = in.read() ) != -1 ) {
request.append( (char) i );
if( request.toString().endsWith( "\r\n\r\n" ) || request.toString().endsWith( "\n\n" ) ) {
return request.toString();
}
}
return request.toString();
}
public void release() {
try {
running = false;
try {
Thread.sleep( 100 );
} catch (Exception ignore) {}
if ( server != null && server.isClosed() == false )
server.close();
}
catch ( IOException e ) {
System.err.println( "Could not release server:" + e.getMessage() );
}
}
public void setResponse(String response) {
this.response = response;
}
public List<String> getRequests() {
return requests;
}
public String getPostRequest() {
return postRequest;
}
}