*/
public void run()
{
if (log.isLoggable(Level.FINER)) log.finer("Handling client request, accessing AuthServer IOR ...");
BufferedReader iStream = null;
DataOutputStream oStream = null;
String clientRequest = "";
boolean first = true;
try {
iStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
oStream = new DataOutputStream(sock.getOutputStream());
clientRequest = iStream.readLine();
String headerLine; // "\r\n" carriage return and line feed terminate the http header section
while (true /*!sock.isClosed() JDK 1.4 only*/) {
headerLine = iStream.readLine();
if (log.isLoggable(Level.FINE)) log.fine("Receiving header '" + headerLine + "'");
if (headerLine == null || headerLine.trim().length() < 1) {
break;
}
}
if (log.isLoggable(Level.FINER)) log.finer("Request from client " + getSocketInfo());
if (clientRequest == null) {
String info = "Empty request ignored " + getSocketInfo();
errorResponse(oStream, "HTTP/1.1 400 Bad Request", null, true, info);
log.warning(info);
return;
}
first = false;
if (log.isLoggable(Level.FINE)) log.fine("Handling client request '" + clientRequest + "' ...");
StringTokenizer toks = new StringTokenizer(clientRequest);
if (toks.countTokens() != 3) {
String info = "Wrong syntax in client request: '" + clientRequest + "', closing " + getSocketInfo() + " connection.";
errorResponse(oStream, "HTTP/1.1 400 Bad Request", null, true, info);
log.warning(info);
return;
}
String method = toks.nextToken(); // "GET"
String resource = toks.nextToken(); // "/AuthenticationService.ior"
// String version =
toks.nextToken(); // "HTTP/1.0"
/*
if (false) { // TEST ONLY:
Uri uri = null;
try {
// TODO: use UriAuthority to parse the request and forward it to CommandManager
//UriAuthority uriAuthority = new UriAuthority(resource);
// To test a telnet with
// GET http://joe:mypasswd@develop:3412/admin/?key=XX HTTP/1.0
// !! From browser we only get "/admin/?key=XX" -> 'joe:mypasswd' is not delivered!!
uri = new Uri(glob, resource);
if (log.isLoggable(Level.FINER)) log.call(ME, "Request is" + uri.toXml());
}
catch (XmlBlasterException e) {
String info = getSocketInfo() + ": " + e.toString();
log.call(ME, info);
errorResponse(oStream, "HTTP/1.1 400 Bad Request", null, true, info);
return;
}
finally {
if (log.isLoggable(Level.FINER)) {
while (true) {
String req = iStream.readLine();
if (req == null)
break;
if (log.isLoggable(Level.FINER)) log.call(ME, req);
}
}
}
}
*/
// RFC 2068 enforces minimum implementation GET and HEAD
if (!method.equalsIgnoreCase("GET") && !method.equalsIgnoreCase("HEAD")) {
String info = "Invalid method in client " + getSocketInfo() + " request: '" + clientRequest + "'";
errorResponse(oStream, "HTTP/1.1 501 Method Not Implemented", "Allow: GET", true, info);
log.warning(info);
return;
}
// lookup if request is registered
resource = resource.trim();
Object obj = knownRequests.get(resource);
if(log.isLoggable(Level.FINE)) log.fine("1. Resource: " + resource + " => " + obj);
if (obj == null) {
Iterator it = knownRequests.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
if (resource.startsWith(key)) {
obj = knownRequests.get(key);
break;
}
}
if (obj == null) {
String info = "Ignoring unknown data '" + resource + "' from client " + getSocketInfo() + " request: '" + clientRequest + "'";
errorResponse(oStream, "HTTP/1.1 404 Not Found", null, true, info);
log.warning(info);
return;
}
}
if(log.isLoggable(Level.FINE)) log.fine("2. Resource: " + resource + " => " + obj);
HttpResponse httpResponse;
if (obj instanceof String) {
httpResponse = new HttpResponse((String)obj, "text/plain"); // CORBA IOR
}
else {
I_HttpRequest httpRequest = (I_HttpRequest)obj; // Registered plugins
httpResponse = httpRequest.service(resource, new TreeMap());
}
// java.net.HttpURLConnection.HTTP_OK:
errorResponse(oStream, "HTTP/1.1 200 OK", null, false, null);
String length = "Content-Length: " + httpResponse.getContent().length;
oStream.write((length+CRLF).getBytes());
//oStream.write(("Transfer-Encoding: chunked"+CRLF).getBytes()); // java.io.IOException: Bogus chunk size
oStream.write(("Content-Type: "+httpResponse.getMimeType()+"; charset=utf-8"+CRLF).getBytes());
if (!method.equalsIgnoreCase("HEAD")) {
oStream.write(CRLF.getBytes());
oStream.write(httpResponse.getContent());
}
oStream.flush();
}
catch (Throwable e) {
if (clientRequest == null && first) {
if (log.isLoggable(Level.FINE)) log.fine("Ignoring connect/disconnect attempt, probably a xmlBlaster client detecting its IP to use");
} else {
log.warning("Problems with sending response for '" + clientRequest + "' to client " + getSocketInfo() + ": " + e.toString());
}
// throw new XmlBlasterException(ME, "Problems with sending IOR to client: " + e.toString());
}
finally {
try { if (iStream != null) iStream.close(); } catch (IOException e) { }
try { if (oStream != null) oStream.close(); } catch (IOException e) { }
try { sock.close(); } catch (IOException e) { }
}
}