/* * Accepts a new request from the HTTP server. * Finishes the request accepted by the previous call * to FCGI_Accept. Sets up the FCGI environment and reads * saved and per request environmental varaibles into * the request object. (This is redundant on System.props * as long as we can handle only one request object.) */ int FCGIAccept() throws IOException { boolean isNewConnection; boolean errCloseEx = false; boolean outCloseEx = false; if (request != null) { /* * Complete the previous request */ System.err.close(); System.out.close(); boolean prevRequestfailed = (errCloseEx || outCloseEx || request.inStream.getFCGIError() != 0 || request.inStream.getException() != null); if (prevRequestfailed || !request.keepConnection) { request.socket.close(); request.socket = null; } if (prevRequestfailed) { request = null; return -1; } } else { /* * Get a Request and initialize some variables */ request = new FCGIRequest(); request.socket = null; request.inStream = null; } isNewConnection = false; /* * if connection isnt open accept a new connection (blocking) */ for (; ; ) { if (request.socket == null) { try { request.socket = srvSocket.accept(); } catch (IOException e) { request.socket = null; request = null; return -1; } isNewConnection = true; } /* Try reading from new connection. If the read fails and * it was an old connection the web server probably closed it; * try making a new connection before giving up */ request.isBeginProcessed = false; request.inStream = new FCGIInputStream(request.socket.getInputStream(), 8192, 0, request); request.inStream.fill(); if (request.isBeginProcessed) { break; } request.socket.close(); request.socket = null; if (isNewConnection) { return -1; } } /* * Set up the objects for the new request */ request.params = new Properties(startupProps); switch (request.role) { case FCGIGlobalDefs.def_FCGIResponder: request.params.put("ROLE", "RESPONDER"); break; case FCGIGlobalDefs.def_FCGIAuthorizer: request.params.put("ROLE", "AUTHORIZER"); break; case FCGIGlobalDefs.def_FCGIFilter: request.params.put("ROLE", "FILTER"); break; default: return -1; } request.inStream.setReaderType(FCGIGlobalDefs.def_FCGIParams); /* * read the rest of request parameters */ if (new FCGIMessage(request.inStream).readParams(request.params) < 0) { return -1; } request.inStream.setReaderType(FCGIGlobalDefs.def_FCGIStdin); request.outStream = new FCGIOutputStream( request.socket.getOutputStream(), 8192, FCGIGlobalDefs.def_FCGIStdout, request); request.errStream = new FCGIOutputStream( request.socket.getOutputStream(), 512, FCGIGlobalDefs.def_FCGIStderr, request); request.numWriters = 2; return 0; }