/*
*/
/*
* This is a simple multi-threaded version of the HttpEcho program.
* It listens for HTTP requests on a given port and sends back
* the HTTP header and body that were sent by the client.
* It's nice for looking at the header information that your
* browser is sending, or looking at the contents of SOAP requests
* that a program is generating.
*
* Julian Robichaux -- http://www.nsftools.com
*/
import java.io.*;
import java.net.*;
public class HttpEchoMT
{
public static void main (String args[])
{
if (args.length == 0)
{
System.out.println("USAGE: java HttpEchoMT ");
return;
}
try {
int port = Integer.parseInt(args[0]);
ServerSocket server = new ServerSocket(port);
System.out.println("Started HttpEchoMT on port " + port + ". Press CTRL-C to end.\n");
while (true)
{
Socket client = server.accept();
EchoThread t = new EchoThread(client);
t.start();
}
} catch (Exception e) {
System.out.println(e);
}
}
}
class EchoThread extends Thread
{
private Socket echoSocket;
public EchoThread(Socket s)
{
echoSocket = s;
}
public void run()
{
try
{
BufferedReader in = new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
PrintWriter out = new PrintWriter(echoSocket.getOutputStream());
StringBuffer header = new StringBuffer("");
StringBuffer body = new StringBuffer("");
String data;
int contentLength = 0;
int pos = 0;
// get the header
while ((data = in.readLine()) != null)
{
// the header ends at the first blank line
if (data.length() == 0)
break;
header.append(data + "\n");
pos = data.toLowerCase().indexOf("content-length:");
if (pos >= 0)
contentLength = Integer.parseInt(data.substring(pos + 15).trim());
}
// get the body, if any
if (contentLength > 0)
{
try {
char[] cbuf = new char[contentLength];
in.read(cbuf);
body.append(cbuf);
} catch (Exception e) {
body.append("Error: " + e);
}
} else {
body.append("No Body information retrieved. " +
"Content-Length equals zero or was not specified.");
}
// write back to the client
out.print("HTTP/1.0 200\nContent Type: text/plain\n\n");
out.println("HEADER:");
out.println(header);
out.println("BODY:");
out.println(body);
// write to the console too
System.out.println("HEADER:");
System.out.println(header);
System.out.println("BODY: (" + contentLength + " / " + body.length() + ")");
System.out.println(body);
System.out.println("\n============ HttpEchoMT on Port " + echoSocket.getLocalPort() +
". Press CTRL-C to End ============\n");
// close all the client streams so we can listen again
out.close();
in.close();
echoSocket.close();
} catch (Exception e) {
System.out.println(e);
}
}
}