⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpiorserver.java

📁 java开源的企业总线.xmlBlaster
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    * 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 + -