📄 httpiorserver.java
字号:
* Access the server settings for logging. * @return The socket <ip>:<port>, for example "server.xmlBlaster.org:3412" */ public String getSocketInfo() { StringBuffer sb = new StringBuffer(196); if (this.listen == null) { if (running) { // Wait on thread to startup for (int i=0; i<10; i++) { try { Thread.sleep(20L); } catch( InterruptedException e) {} if (this.listen != null) break; } } if (this.listen == null) { return ""; } } sb.append(listen.getInetAddress().getHostAddress()); sb.append(":").append(this.HTTP_PORT); return sb.toString(); }} // class HttpIORServer/** * Handles a request from a client, delivering the AuthServer IOR */class HandleRequest extends Thread{ private final String ME; private final Global glob; private static Logger log = Logger.getLogger(HttpIORServer.class.getName()); private final Socket sock; private final Hashtable knownRequests; private final String CRLF = "\r\n"; private final String VERSION = "1.0"; /** */ public HandleRequest(Global glob, Logger log, Socket sock, Hashtable knownRequests) { this.glob = glob; this.ME = "HandleRequest" + this.glob.getLogPrefixDashed(); this.log = log; this.sock = sock; this.knownRequests = knownRequests; start(); } /** * TODO: The HTTP/1.1 spec states that we should return the "Date:" header as well. * <p /> * Test with "telnet <host> 3412"<br /> * GET /AuthenticationService.ior HTTP/1.0 */ 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) { } } } private void errorResponse(DataOutputStream oStream, String code, String extra, boolean body, String info) throws IOException { oStream.write((code+CRLF).getBytes()); oStream.write(("Server: XmlBlaster HttpServer/"+VERSION+CRLF).getBytes()); if (extra != null) oStream.write((extra+CRLF).getBytes()); oStream.write(("Connection: close"+CRLF).getBytes()); if (body) { oStream.write((CRLF+"<html><head><title>"+code+"</title></head><body>" + "<h2>XmlBlaster HTTP server " + VERSION + "</h2>" + "<p>" + code + "</p>" + "<p>" + info + "</p>" + "<p><a href='" + glob.getProperty().get("http.info.url", "http://www.xmlBlaster.org") + "'>Info</a></p>" + "</body></html>").getBytes()); } } private String getSocketInfo() { StringBuffer sb = new StringBuffer(196); if (sock == null) return ""; sb.append(sock.getInetAddress().getHostAddress()); sb.append(":").append(sock.getPort()); sb.append(" -> "); sb.append(sock.getLocalAddress().getHostAddress()); sb.append(":").append(sock.getLocalPort()); return sb.toString(); }} // class HandleRequest
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -