FCGIInterface.java [plain text]
package com.fastcgi;
import java.net.*;
import java.io.*;
import java.util.Properties;
public class FCGIInterface
{
private static final String RCSID = "$Id: FCGIInterface.java,v 1.4 2000/03/27 15:37:25 robs Exp $";
public static FCGIRequest request = null;
public static boolean acceptCalled = false;
public static boolean isFCGI = true;
public static Properties startupProps;
public static ServerSocket srvSocket;
public int FCGIaccept() {
int acceptResult = 0;
if (!acceptCalled){
isFCGI = System.getProperties().containsKey("FCGI_PORT");
acceptCalled = true;
if (isFCGI) {
startupProps = new Properties(System.getProperties());
String str =
new String(System.getProperty("FCGI_PORT"));
if (str.length() <= 0) {
return -1;
}
int portNum = Integer.parseInt(str);
try {
srvSocket = new ServerSocket(portNum);
} catch (IOException e) {
if (request != null)
{
request.socket = null;
}
srvSocket = null;
request = null;
return -1;
}
}
}
else {
if (!isFCGI){
return -1;
}
}
if (isFCGI){
try {
acceptResult = FCGIAccept();
} catch (IOException e) {
return -1;
}
if (acceptResult < 0){
return -1;
}
System.setIn(new BufferedInputStream(request.inStream, 8192));
System.setOut(new PrintStream(new BufferedOutputStream(
request.outStream, 8192)));
System.setErr(new PrintStream(new BufferedOutputStream(
request.errStream, 512)));
System.setProperties(request.params);
}
return 0;
}
int FCGIAccept() throws IOException{
boolean isNewConnection;
boolean errCloseEx = false;
boolean outCloseEx = false;
if (request != null) {
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 {
request = new FCGIRequest();
request.socket = null;
request.inStream = null;
}
isNewConnection = false;
for(;;) {
if (request.socket == null){
try {
request.socket = srvSocket.accept();
} catch (IOException e) {
request.socket = null;
request = null;
return -1;
}
isNewConnection = true;
}
request.isBeginProcessed = false;
request.inStream =
new FCGIInputStream((FileInputStream)request.
socket.getInputStream(),
8192, 0, request);
request.inStream.fill();
if (request.isBeginProcessed) {
break;
}
request.socket.close();
request.socket = null;
if (isNewConnection) {
return -1;
}
}
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);
if (new FCGIMessage(request.inStream).readParams(request.params) < 0) {
return -1;
}
request.inStream.setReaderType(FCGIGlobalDefs.def_FCGIStdin);
request.outStream
= new FCGIOutputStream((FileOutputStream)request.socket.
getOutputStream(), 8192,
FCGIGlobalDefs.def_FCGIStdout,request);
request.errStream
= new FCGIOutputStream((FileOutputStream)request.socket.
getOutputStream(), 512,
FCGIGlobalDefs.def_FCGIStderr,request);
request.numWriters = 2;
return 0;
}
}